Che cosa causa java.lang.reflect.InvocationTargetException?

1. Panoramica

Quando si lavora con Java Reflection API, è comune incontrare java.lang.reflect.InvocationTargetException . In questo tutorial, daremo uno sguardo a esso e come gestirlo con un semplice esempio .

2. Causa di InvocationTargetException

Si verifica principalmente quando lavoriamo con il livello di riflessione e proviamo a invocare un metodo o un costruttore che genera un'eccezione sottostante.

Il livello di riflessione racchiude l'eccezione effettiva generata dal metodo con InvocationTargetException . Proviamo a capirlo con un esempio.

Scriviamo una classe con un metodo che lancia intenzionalmente un'eccezione:

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

Ora, invochiamo il metodo sopra usando la riflessione in un semplice test JUnit 5:

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

Nel codice precedente, abbiamo affermato InvocationTargetException , che viene generata durante il richiamo del metodo. Una cosa importante da notare qui è che l'eccezione effettiva, ArithmeticException in questo caso, viene racchiusa in una InvocationTargetException.

Ora, la domanda che mi viene in mente è: perché la riflessione non lancia l'eccezione vera in primo luogo?

Il motivo è che ci consente di capire se l' eccezione si è verificata a causa di un errore nella chiamata del metodo attraverso il livello di riflessione o se si è verificata all'interno del metodo stesso.

3. Come gestire InvocationTargetException ?

In questo caso, l'effettiva eccezione sottostante è la causa di InvocationTargetException , quindi possiamo utilizzare Throwable.getCause () per ottenere maggiori informazioni a riguardo.

Vediamo come possiamo usare getCause () per ottenere l'eccezione effettiva nello stesso esempio usato sopra:

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

Qui, abbiamo utilizzato il metodo getCause () sullo stesso oggetto eccezione che è stato lanciato. E abbiamo affermato ArithmeticException.class come causa dell'eccezione.

Quindi, una volta ottenuta l'eccezione sottostante, possiamo rilanciare la stessa, racchiuderla in un'eccezione personalizzata o semplicemente registrare l'eccezione in base ai nostri requisiti.

4. Conclusione

In questo breve articolo, abbiamo visto come il livello di riflessione avvolge qualsiasi eccezione sottostante. Abbiamo anche visto come determinare la causa sottostante di InvocationTargetException e come gestire un tale scenario con un semplice esempio.

Come al solito, il codice utilizzato in questo articolo è disponibile su GitHub.