Exception handling 예외처리
- 예외 처리의 정의와 목적
- 정의 : 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성
- 목적 : 프로그램의 비정상 종료를 막고 정상적인 실행 상태를 유지하는 것
try-catch 문
try {
} catch (Exception1 e1) {
} catch (Exception2 e2) {
} catch (ExceptionN eN) {
}
- if 문과 달리, try 블럭이나 catch 블럭 내에 포함된 문장이 하나뿐이어도 괄호
{}
생략 불가
try-catch 문의 흐름
- try 블럭 내에서 예외가 발생한 경우
- 발생한 예외와 일치하는 catch 블럭이 있는지 확인한다.
- 일치하는 catch 블럭을 찾게 되면 그 catch 블럭 내의 문장들을 수행
- 전체 try-catch 문을 빠져나가서 그 다음 문장을 계속 수행한다.
- 만일 일치하는 catch 블럭을 찾지 못하면 예외는 처리되지 못한다.
- try블럭 내에서 예외가 발생하지 않은 경우
- catch 블럭을 거치지 않고 전체 try-catch 문을 빠져나가서 수행을 계속한다.
Exception
- 모든 예외의 최고 조상
- Exception이 선언된 catch 블럭은 모든 예외 처리 가능
- 이러한 catch 블럭은 마지막에 작성
예외 객체
- 예외가 발생하면 예외 객체가 생성된다.
- 예외 객체에 있는 메서드들로 예외 정보를 가져올 수 있다.
try {
System.out.println(0/0);
} catch (ArithmeticException ae) {
ae.printStackTrace();
System.out.println(ae.getMessage());
} catch (Exception e) {
}
printStackTrace()
- 예외 발생 당시의 호출 스택 (Call Stack) 에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.
getMessage()
- 발생한 예외 클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
멀티 catch 블럭
- 내용이 같은 catch 블럭을 하나로 합친 것 (JDK 1.7 부터)
try {
} catch (ExceptionA e) {
e.printStackTrace();
} catch (ExceptionB e2) {
e2.printStackTrace();
}
try {
} catch (ExceptionA | ExceptionB e) {
e.printStackTrace();
}
- 두 예외 클래스가 상속 관계면 에러 🔴
- 한 예외 클래스에만 있는 멤버 사용 불가 🔴
- 둘 중 어느 예외 클래스가 적용될지 모른다.
- 두 예외 클래스의 공통 멤버만 사용 가능 ✅