2007년 8월 30일 목요일

InvocationTargetException 속에는 어떤 것들이 들어있을가?

InvocationTargetException 속에는 단순 Exception만 들어있는것은 아니다!

InvocationTargetException 속에는 Throwable 객체가 내포되여있다.
InvocationTargetException 생성자만 보아도 쉽게 알수 있는 사실이다.

InvocationTargetException(Throwable target)

더욱 놀라운 사실은 null도 Throwable 객체속에 할당되여 들어갈수 있다는것이다.
실제 리턴하는 값은 InvocationTargetException을 야기시키는 예외인데 만약 없으면 getCause()가 null을 리턴하게 되는것이다.

InvocationTargetException.getCause() 를 호출할때 프로그래머는 모두 네가지 종류의 cause를 리턴 받을수 있다.

  1. null
  2. unchecked exceptions (RuntimeExceptions such as IllegalArgumentException, NullPointerException, etc)
  3. checked exceptions (e.g., NameNotFoundException, YourApplicationException)
  4. java.lang.Error (e.g., StackOverflowError, OutOfMemoryError, InternalError, UnknownError)

때문에 InvocationTargetException을 처리할때 위 4가지 예외를 모두 고려하여 처리해야만 한다.
아래에 실제 InvocationTargetException 처리용 샘플코드를 첨부하겠다.

try {
 helloMethod.invoke(foo);
} catch (IllegalAccessException ex) {
 logger.log(Level.SEVERE, "Invocation failed.", ex);
} catch (InvocationTargetException ex) {
 Throwable cause = ex.getCause();
 if(cause == null) {
  throw new IllegalStateException(
   "Got InvocationTargetException, but the cause is null.", ex);
 } else if(cause instanceof RuntimeException) {
  throw (RuntimeException) cause;
 } else if(cause instanceof Exception) {
  logger.log(Level.SEVERE, "Invocation failed with cause: ", cause);
 } else {
  logger.log(Level.SEVERE, "Invocation failed with error: ", cause);
 }

}

자주색으로 표기된부분이 바로 InvocationTargetException이 발생하였을시 처리를 해주는 부분이다.
만약 cause가 null이라면 IllegalStateException을 만들고 그속에 InvocationTargetException을 담아서 던진다.
또한 이것이 아닌 RuntimeException으로 기인한 예외라면 해당 예외를 던진다.

댓글 없음:

댓글 쓰기