예외처리
프로그램 오류는 아래의 그림처럼 종류가 나뉜다.
컴파일 에러
컴파일할때 발생하는 에러로 프로그램이 시작되지 않는다.런타임 에러
프로그램이 실행 후 발생하는 에러로 프로그램이 비정상 종료된다.논리적 에러
프로그램을 구현한 의도와 달리 동작, 정상적으로 프로그램이 실행되고 종료된다.에러(error)
코드로 해결할 수 없는 심각한 프로그램 오류예외(exception)
코드로 수습할 수 있는 프로그램 오류이기 때문에try-catch구문
으로 처리해줘야한다Exception
사용자의 실수
로 인해 발생한 예외(IOException, ClassNotFoundException 등) +프로그래머의 실수
로 인해 발생한 예외(Runtime Exception)이지만 이 게시물에서는 설명 편의상사용자의 실수로 인해 발생한 예외로 exception을 지칭
하겠다. 예외처리를 반드시 해줘야한다.(checked
)Runtime Exception
프로그래머의 실수
로 인해 발생한 예외, 예외처리을 선택적으로 해줘도 된다.(unchecked
)
try-catch구문
예외를 처리하기 위해서 사용하는 구문이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
try {
hasNoException();
a();
System.out.println("a 정상작동");
b();
System.out.println("end");
} catch (a메소드에서 발생할 수 있는 예외1) {
System.out.println("a 에외처리");
} catch (b메소드에서 발생할 수 있는 예외2) {
System.out.println("b 에외처리");
} ...
1. 메소드 a에서 예외가 발생하는 경우
- hasNoException()
- a(); 실행
- a 예외처리 출력
- try-catch구문 종료
2. 메소드 b에서 예외가 발생하는 경우
- hasNoException()
- a(); 실행
- a 정상작동 출력
- b(); 실행
- b 예외처리 출력
- try-catch구문 종료
3. 예외가 없는 경우
- hasNoException()
- a(); 실행
- a 정상작동 출력
- b(); 실행
- b 정상작동 출력
- end 출력
- try-catch구문 종료
4. 메소드 hasNoException에서 예외가 발생하는 경우
- hasNoException()
- 예외 처리해줄 catch문이 없기 떄문에
프로그램 비정상 종료
finally블럭
try-catch-finally순으로 구성되며 예외 발생 유무나 return문 유무와 상관없이 finally블럭 안에 있는 코드는 반드시 실행된다.
예외 처리 방법
try-catch구문
메소드에 예외 선언
메소드 선언부에 throws 예외유형
을 붙여 예외처리를 호출한 메소드에서 처리하도록 한다.
1
2
3
4
5
6
7
8
9
void A(){
method1();
}
void method1() throws Exception{
method2();
}
void method2() throws Exception{
throw new Exception(); // 고의적으로 예외 발생
}
throw
로 발생한 예외는 method2가 method1에게 thorws
하고 method1은 throws
해서 A에게 예외처리를 시킨다. 최종적으로 예외처리는 throws가 없는 호출메소드
- 예외 되던지기(re-throwing)
예외 처리 후 고의적으로 예외를 다시 발생시켜 호출한 메소드로 전달한다.양쪽에서 예외를 처리해야할 경우
사용한다.
연결된 예외
여러 개의 예외를 하나의 큰 예외로 묶어 처리할 떄
checked예외(Exception)를 unchecked 예외(Runtime Exception)으로 처리할 때
Comments powered by Disqus.