¿Qué hay dentro de un InvocationTargetException?

por | Agosto 6, 2013

Al usar librerías muchas de las veces tenemos que heredar una excepción del tipo InvocationTargetException en mi caso al implementar una pantalla que procesaba los eventos con hilos para dar funcionalidad a una barra de progreso en Eclipse RCP 3.x el correr el hilo de la siguiente manera:

org.eclipse.jface.wizard.Wizard.getContainer().run(true, false, operacion);

La firma del método me obligaba a capturar esta excepción, pero que es y como tratarla.

De lo poco que encontré en la web esto es lo que pude aclarar, cualquier aclaración nos vemos en los comentarios.

Cualquier Throwable se puede envolver en un java.lang.reflect.InvocationTargetException como se aprecia en el constructor:

InvocationTargetException(Throwable target)

Incluso un valor nulo puede estar en su interior, el JavaDoc para el método getCause() así lo demuestra:

Returns the the cause of this exception (the thrown target exception, which may be null).

Así que cuando hacemos una llamada a InvocationTargetException.getCause() hay que tener en cuenta que puede devolver estas cuatro cosas:

  1. null
  2. Excepciones unchecked (RuntimeExceptions como IllegalArgumentException, NullPointerException, etc)
  3. Excepciones checked ( NameNotFoundException, TuExcepcion, etc)
  4. java.lang.Error (StackOverflowError, OutOfMemoryError, InternalError, UnknownError)
   miMetodo.invocar(Algo);
} catch (IllegalAccessException ex) {
   logger.log(Level.SEVERE, "Invocation failed.", ex);
} catch (InvocationTargetException ex) {
   Throwable cause = ex.getCause();
   if (cause == null) {
      throw new IllegalStateException(
        "InvocationTargetException, cause es nulo.", ex);
   } else if (cause instanceof RuntimeException) {
      throw (RuntimeException) cause;
   } else if (cause instanceof Exception) {
      logger.log(Level.SEVERE, "Invocation fallo. Causa: ", cause);
   } else {
      logger.log(Level.SEVERE, "Invocation fallo. Error: ", cause);
   }
}

Por lo tanto el siguiente código puede producir un NullPointerException, mucha gente no revisa que el valor no apunte a un nulo.

} catch (InvocationTargetException ex)
   Throwable cause = ex.getCause();
   cause.printStackTrace();

El siguiente código puede causar un ClassCastException del casting de un RuntimeException, ya que la causa puede ser un Error

} catch (InvocationTargetException ex) {
   Throwable cause = ex.getCause();
   if(cause instanceof MyApplicationException) {
      //codigo
   } else {
      //no son excepciones de la aplicacion y se los pasa por fuera
      throw (RuntimeException) cause;
   }
}

Espero les haya sido de Utilidad.

.

Fuente: https://blogs.oracle.com/chengfang/entry/p_what_s_inside_invocationtargetexception
.