printStackTrace() : 예외발생 당시의 호출스택(Call stack)에 있었던 메서드의 정보와 예외 메시지늘 화면에 출력한다.
getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.try { ... System.out.println(0/0); // 예외발생!!! ... } catch (ArithmeticException ae) { ae.printStackTrace(); System.out.println(ae.getMessage()); } catch (Exception e) { ... }
- 예외발생 -> ArithmeticException 타입의 예외객체 생성 -> 객체에 발생한 예외에 대한 정보가 들어있다. -> printStackTrace() / getMessage() 메서드가 들어있다.
- 참조변수의 타입과 예외의 타입이 일치하므로 catch블럭이 실행된다.(= 참조변수 ae에 ArithmeticException 타입의 객체의 주소값이 들어간다.)
- 참조변수 ae의 유효범위(scope)는 catch블럭이다.
- 1,2,3을 출력하고 예외가 발생
- 예외객체가 생성되어서 catch블럭으로 간다.
- catch블러과 타입이 일치하므로 pritStackTrace를 실행 (왜 예외가 발생했는지 알려준다.)
내용이 같은 catch블럭을 하나로 합친 것(JDK1.7부터)
try { ... } catch (ExceptionA e) { try { e.printStackTrace(); 내용동일 ... } catch (ExceptionB e2) { --------> } catch (ExceptionA | ExceptionB e) { e2.printStackTrace(); 중복제거 e.printStackTrace(); } }
- catch블럭이 2개 있는데, 내용이 동일.
- 그래서, 중복제거 후 하나로 만들어준다.
try { ... // } catch (ParentException | ChildException e) { // 에러! (부모/자식 관계는 X) } catch (ParentException e) { // OK. 위의 라인과 의미상 동일 e.printStackTrace(); }
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) ...
- ExceptionA와 ExceptionB의 공통멤버만 사용가능
- 개인의 멤버를 사용하기 위해서는 if~else문을 사용하여 형변환을 해야 한다.
1.연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 다음
Exception e = new Exception("고의로 발생시켰음");
2.키워드 throw를 이용해서 예외를 발생시킨다.
throw e;
- throw를 통해 예외를 발생시키고, catch블럭과 일치하는지 확인
- 결과 - 에러 메시지 : 고의로 발생시켰음.
java.lang.Exception: 고의로 발생시켰음.
at Ex8_6.main(Ex8_6.java:4)
프로그램이 정상 종료되었음.
checked예외 : 컴파일러가 예외 처리 여부를 체크(예외 처리 필수) (Exception자손 / try-catch 필수)
unchecked예외 : 컴파일러가 예외 처리 여부를 체크 안함(예외 처리 선택)(RuntimeException 자손 / try-catch 선택)
- Exception이 checked예외이므로 필수로 예외를 처리해야 하는데 안해서 컴파일 자체가 안된다.
- RuntimeException은 unchecked예외이므로 예외처리가 선택이라 컴파일 OK다.
- 하지만, RuntimeException이 발생한다.
- 만약에 RuntimeException에서 예외가 필수가 된다면, 참조변수가 있을 때, NullPointerException이 발생할 가능성이 크다.
- 그리고 배열이 있을 때, IndexOutOfBoundsException이 발생할 가능성이 크다. (배열 범위를 벗어날 수 있기 때문에)