¿Qué causa la excepción java.lang.reflect.InvocationTargetException?

1. Información general

Cuando se trabaja con la API de Java Reflection, es común encontrar java.lang.reflect.InvocationTargetException . En este tutorial, lo veremos y cómo manejarlo con un ejemplo simple .

2. Causa de InvocationTargetException

Ocurre principalmente cuando trabajamos con la capa de reflexión e intentamos invocar un método o constructor que arroja una excepción subyacente.

La capa de reflexión envuelve la excepción real lanzada por el método con InvocationTargetException . Intentemos entenderlo con un ejemplo.

Escribamos una clase con un método que arroje una excepción intencionalmente:

public class InvocationTargetExample { public int divideByZeroExample() { return 1 / 0; } }

Ahora, invoquemos el método anterior usando la reflexión en una prueba simple de JUnit 5:

InvocationTargetExample targetExample = new InvocationTargetExample(); Method method = InvocationTargetExample.class.getMethod("divideByZeroExample"); Exception exception = assertThrows(InvocationTargetException.class, () -> method.invoke(targetExample));

En el código anterior, hemos afirmado la InvocationTargetException , que se lanza al invocar el método. Una cosa importante a tener en cuenta aquí es que la excepción real, ArithmeticException en este caso, se envuelve en una InvocationTargetException.

Ahora, la pregunta que me viene a la mente es, ¿por qué la reflexión no arroja la excepción real en primer lugar?

La razón es que nos permite entender si la excepción ocurrió debido a una falla al llamar al método a través de la capa de reflexión o si ocurrió dentro del método mismo.

3. ¿Cómo manejar InvocationTargetException ?

Aquí, la excepción subyacente real es la causa de InvocationTargetException , por lo que podemos usar Throwable.getCause () para obtener más información al respecto.

Veamos cómo podemos usar getCause () para obtener la excepción real en el mismo ejemplo usado anteriormente:

assertEquals(ArithmeticException.class, exception.getCause().getClass());

Aquí, usamos el método getCause () en el mismo objeto de excepción que se lanzó. Y hemos afirmado ArithmeticException.class como la causa de la excepción.

Entonces, una vez que obtenemos la excepción subyacente, podemos volver a lanzar la misma, envolverla en alguna excepción personalizada o simplemente registrar la excepción según nuestro requisito.

4. Conclusión

En este breve artículo, hemos visto cómo la capa de reflexión envuelve cualquier excepción subyacente. También hemos visto cómo determinar la causa subyacente de InvocationTargetException y cómo manejar tal escenario con un ejemplo simple.

Como de costumbre, el código utilizado en este artículo está disponible en GitHub.