-
java 예외 처리대학/객체지향프로그래밍 2022. 10. 9. 17:45
예외가 발생하면, 프로그램은 더이상 동작의 의미가 없어지므로 kernel에서 프로세스를 종료시켜 버린다.
그런 예외의 타입은 크게 Error, Exception 두 개로 나뉜다.
1. Error
개발자가 처리할 수 없는 오류로 Stack Overflow, JVM 자원 부족 등이 이에 해당한다.
2. Exception
개발자가 처리할 수 있는 오류로 0으로 나누기, 배열 밖 인덱스 접근 등이 이에 해당한다.
Exception는 또 검사형 예외, 비검사형 예외로 나뉜다.
1. 검사형 예외(일반 예외)
예외처리를 하지 않으면 컴파일 오류가 발생하는 예외로
예외처리 코드를 반드시 추가해 줘야 하고, 그렇지 않으면 컴파일 조차 되지 않는다.
일반 예외 발생 이유 ClassNotFoundException 존재하지 않는 클래스를 사용하려고 할 때 발생 InterruptedException 인터럽트 핸들러(예외 처리 로직)가 없을 때인터럽트시 발생 NoSuchFieldException 클래스가 명시한 필드를 포함하지 않을 때 발생 NoSuchMethodException 클래스가 명시한 메서드를 포함하지 않을 때 발생 IOException 데이터 입출력 문제가 있을 때 발생 2. 비검사형 예외(실행 예외)
예외처리를 하지 않아도 컴파일은 가능하다.
단, 프로그램 실행 도중에 발생하는 예외로 보통 개발자의 실수로 발생한다.
실행 예외 발생 이유 ArithmeticException 0으로 나누기 같은 부적절한 산술연산 수행시 발생 IlligalArgumentException 메서드에 부적절한 인수가 전달될 때 발생 IndexOutOfBoundsException 배열, 벡터 등에서 범위를 벗어난 인덱스를 참조할 때 발생 NoSuchElementException 요구한 원소가 없을 때 발생 NullPointerException null 값을 가진 참조변수에 접근할 때 발생 NumberFormatException 숫자로 바꿀 수 없는 문자열을 숫자로 변환하려 할 때 발생 - 예외 처리 방식
예외가 발생하면, 해당 예외를 담은 객체가 생성된다.
그리고 그 객체는 예외를 생성한 메서드가 catch 하거나,
예외를 생성한 메서드를 호출한 부모 메서드로 throws 하는 방식으로 처리한다.
따라서 이 예외는 누구도 잡지 않거나, 계속 throws 하다가 끝까지 잡지 못하면 결국 프로그램은 종료되게 된다.
import java.io.IOException; class SubClass { public void errorCode() throws IOException { try { throw new IllegalAccessException("IllegalAccessException from SubClass.errorCode()"); // 이후 코드는 실행 안됨 } catch (IllegalAccessException e) { System.out.println(e); } throw new IOException("IOException from SubClass.errorCode()"); } } public class App { public static void main(String[] args) { SubClass sc = new SubClass(); try { sc.errorCode(); // 에러가 발생하니 이후 코드는 실행 안됨 } catch (IOException | ArithmeticException e) { System.out.println(e); } finally { System.out.println("fianlly"); } System.out.println("fianlly, but not good."); } } 실행 결과 java.lang.IllegalAccessException: IllegalAccessException from SubClass.errorCode() java.io.IOException: IOException from SubClass.errorCode() fianlly fianlly, but not good.
throw 키워드는 예외를 직접 발생시킬 수 있는 키워드이다.
디버깅 또는 의도적으로 예외를 발생시켜야 할 상황에 유용하다.
위 코드처럼 다중 예외 처리도 가능하다.
하지만, Exception은 모든 예외 클래스의 슈퍼 클래스이기 때문에 마지막에 catch 하는것이 바람직하다.
(처음부터 Exception으로 catch하면 뒤의 catch는 무용지물이 된다)
동일한 예외처리 핸들러를 구현할 경우에는 | (OR) 연산자를 이용해 다중 catch문을 구현하는 방법도 있다.
또한 finally 문을 이용해서 예외 발생 여부에 관계없이 실행하는 블록을 지정할 수도 있다.
열었던 파일이나 소켓 등을 닫을 때 쓰는것이 좋다.
try-catch-finally 밖에 써도 실행은 되지만, 예외 처리가 안되었을 경우에는 실행되지 않을 수도 있으므로
바람직한 방법은 아니다.
'대학 > 객체지향프로그래밍' 카테고리의 다른 글
java 열거형 / 박싱 / 어노테이션 (0) 2022.12.09 java 멀티스레딩 (2) 2022.10.18 java 인터페이스 (0) 2022.10.09 java 패키지 (0) 2022.10.09 java 클래스 (0) 2022.10.09