본문 바로가기

기초 문법 알아보기 Java

예외처리 Exception handling : 예외의 발생과 catch블럭

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로 개별적으로 처리할 수 있다.