예외 처리하기(try-catch)
try{
} catch (Exception e1) {
} catch (Exception e2) {
} catch (Exception eN) {
}
catch 블럭
은 여러개 올 수 있다.(발생할 수 있는 예외가 여러 개 있을 수 있다는 말)
- if문과 달리,
try 불럭
이나 catch 블럭
내에 포함된 문장이 하나뿐이어도 괄호{}를 생략할 수 없다.(괄호 생략 불가.)
try-catch문의 흐름
- 1) try 블럭 내에서 예외가 발생한 경우,
- (1) 발생한 예외와 일치하는 catch 블럭이 있는지 확인한다.
- (2) 일치하는 catch 블럭을 찾게 되면, 그 catch 블럭 내의 문장들을 수행하고, 전체 try-catch 문을 빠져나가서 그 다음 문장을 계속해서 수행한다. 만일 일치하는 catch 블럭을 찾지 못하면, 예외는 처리되지 못한다.
- 2) try 블럭 내에서 예외가 발생하지 않은 경우,
- (1) catch 블럭을 거치지 않고, 전체 try-catch 문을 빠져나가서 수행을 계속한다.
printStackTrace()와 getMessage()
- 예외가 발생하면 예외 객체가 생성이 되고, 그 안에
printStackTrace()
와 getMessage()
등을 가지고 있다.
printStackTrace()
- 예외발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.
getMessage()
- 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
- 예외 객체에는 다음과 같이 다양한 메서드들이 존재한다.
멀티 catch블럭
- 내용이 같은 catch 블럭을 하나로 합친 것 (JDK 1.7부터)
- 중복을 제거할 수 있다.
example
try{
} catch (ExceptionA | ExceptionB e) {
e.printStackTrace();
}
유의사항
- catch 블럭에 들어갈 예외 클래스가 서로 부모-자식 관계면 안된다.(부모로 포함할 수 있기 때문)
try{
} catch (ParentException e) {
e.printStackTrace();
}
- 한 예외 클래스에만 존재하는 메서드를 호출하면 안된다. (분기문을 통해 작성해야 함)
- 사실 아래와 같이 쓸바에는 catch 블록을 따로 구성하는게 더 바람직하다.
try{
} catch (ExceptionA | ExceptionB e) {
e.methodA();
if (e instanceof ExceptionA) {
ExceptionA e1 = (ExceptionA)e;
e1.methodA();
} else {
}
}