본문 바로가기

Java

예외 처리(Exception Handling)(3) - printStackTrace(), 멀티 catch 블럭

1) printStackTrace(), getMessage()

- try 블록을 실행하다가 예외가 발생하면, 예외 객체가 만들어집니다.

  예외 객체는 타입이 ArithmeticException 입니다.  

  이 객체에는 발생한 예외에 대한 정보가 들어 있습니다. 

  그리고 printStackTrace(), getMessage()와 같은 메소드들을 갖고 있습니다. 

class Ex8_t{

    public static void main(String[] args){
        System.out.println(1);
        System.out.println(2);
        
        try{
            System.out.println(3);
            System.out.println(0/0);
            System.out.println(4); 
        }catch(ArithmeticExcpetion ae){
          ae.printStackTrace();
          System.out.println("예외메시지: " + ae.getMessage());
        }
        
        System.out.println(6);
    }
}

// 실행 결과 
1 
2
3
java.lang.ArithmeticException: / by zero at Ex8_5.main(Ex8_5.java:8)
예외 메시지 : / by zero
6

- printStackTrace(): 예외 발생 당시의 호출 스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력합니다.

- getMessage(): 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있습니다. 

 

2) 멀티 catch 블럭

- 멀티 catch 블럭은 내용이 같은 catch 블럭을 하나로 합친 것을 의미합니다. 

  단, 멀티 catch 블럭에 쓰는 두 클래스가 부모-자식 관계여서는 안됩니다. 

try{                                         try{

}catch(Exception A){                         }catch(Exception A | Exception B){
    e.printStackTrace();             ->           e.printStackTrace();
}catch(Exception B){                         }
    e.printStackTrace();
}

- 멀티 catch 블럭을 사용할 때는, 특정 클래스에만 선언되어 있는 메소드를 사용할 때 주의해야 합니다. 

try{

}catch(ExceptionA | ExceptionB e){
    e.methodA(); // 에러 ExceptionA에 선언된 methodA()는 호출 불가
    
    if(e instanceof ExceptionA){
        ExceptionA e1 = (ExceptionA)e;
        e1.methodA(); // OK. ExceptionA에 선언된 메서드 호출 가능
    }else if(e instanceof ExceptionB){
        ...
    }
}

 

참고

남궁성 자바의 정석