728x90
class Exception{
public static void main(String[] args){
System.out.println(1);
System.out.println(2);
try{
System.out.println(3);
System.out.println(0/0); // 0으로 나눠서 ArithmeticException을 발생시킨다
System.out.println(4); // 실행되지 않는다
} catch(ArithmethicException ae){
if(ae instanceof ArithmeticException)
System.out.println("true");
System.out.println("ArithmeticException");
} catch(Exception e){ // ArithmeticException을 제외한 모든 예외가 처리된다
System.out.println("Exception");
}
System.out.println(6);
}
}
실행결과
1
2
3
true
ArithmeticException
6
try블럭에서 ArithmeticException이 발생하였으므로 catch블록을 하나씩 검사하게 된다.
첫번째 검사에서 일치하는 catch블럭을 찾았으므로 두번째 catch블럭은 실행되지 않는다.
printStackTrace()와 getMessage()
예외가 발생했을 때 생성되는 예외 클래스의 인스턴스에는 발생한 예외에 대한 정보가 담겨져 있다.
printStackTrace()와 getMessage()를 통해서 이 정보들을 얻을 수 있다.
printStackTrace()는 예외발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.
getMessage()는 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
멀티 catch블럭
try{
...
} catch(ExceptionA | ExceptionB e){
e.methodA(); // err
if(e instanceof ExceptionA){
ExceptionA el = (ExceptionA)e;
e1.methodA();
}else{
...
}
e.printStackTrace();
}
JDK 1.7부터 여러 catch블럭을 '|' 기호를 이용해서 합칠 수 있으며 이를 멀티 catch블럭이라 한다. 다만 조상과 자손의 관계에 있다면 컴파일 에러가 발생한다. 멀티 catch블럭 내에서는 실제로 어떤 예외가 발생했는지 알 수 없다. 그래서 참조변수 e로 멀티 catch블럭에 예외 클래스들의 공통 분모인 조상 예외 클래스에 선언된 멤버만 사용할 수 있다. 필요하다면 instanceof로 개별적으로 처리할 수 있다.
'기초 문법 알아보기 Java' 카테고리의 다른 글
컬렉션 프레임웍 Collection Framework : Stack, Queue (0) | 2024.04.06 |
---|---|
컬렉션 프레임웍 Collection Framework : ArrayList, LinkedList (0) | 2024.04.05 |
컬렉션 프레임웍 Collection Framework : 핵심 인터페이스 (0) | 2024.04.05 |
예외처리 Exception handling : 예외 클래스의 계층구조 (0) | 2024.03.23 |
예외처리 Exception handling : 프로그램 오류 (0) | 2024.03.23 |