Was verursacht java.lang.reflect.InvocationTargetException?

1. Übersicht

Bei der Arbeit mit der Java Reflection-API tritt häufig java.lang.reflect.InvocationTargetException auf . In diesem Tutorial werden wir uns das anhand eines einfachen Beispiels ansehen und wie man damit umgeht .

2. Ursache der InvocationTargetException

Es tritt hauptsächlich auf, wenn wir mit der Reflexionsebene arbeiten und versuchen, eine Methode oder einen Konstruktor aufzurufen, der selbst eine zugrunde liegende Ausnahme auslöst.

Die Reflektionsebene umschließt die von der Methode ausgelöste tatsächliche Ausnahme mit der InvocationTargetException . Versuchen wir es anhand eines Beispiels zu verstehen.

Schreiben wir eine Klasse mit einer Methode, die absichtlich eine Ausnahme auslöst:

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

Rufen wir nun die obige Methode mithilfe der Reflexion in einem einfachen JUnit 5-Test auf:

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

Im obigen Code haben wir die InvocationTargetException aktiviert , die beim Aufrufen der Methode ausgelöst wird. Hierbei ist zu beachten, dass die eigentliche Ausnahme - in diesem Fall ArithmeticException - in eine InvocationTargetException eingeschlossen wird.

Nun stellt sich die Frage, warum Reflexion nicht überhaupt die eigentliche Ausnahme auslöst.

Der Grund dafür ist, dass wir verstehen können, ob die Ausnahme aufgrund eines Fehlers beim Aufrufen der Methode über die Reflexionsschicht aufgetreten ist oder ob sie innerhalb der Methode selbst aufgetreten ist.

3. Wie gehe ich mit InvocationTargetException um ?

Hier ist die eigentliche zugrunde liegende Ausnahme ist die Ursache für InvocationTargetException , so können wir verwenden Throwable.getCause () , um mehr Informationen über sie zu bekommen.

Mal sehen, wie wir getCause () verwenden können , um die tatsächliche Ausnahme im gleichen Beispiel wie oben zu erhalten:

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

Hier haben wir die Methode getCause () für dasselbe Ausnahmeobjekt verwendet , das ausgelöst wurde. Und wir haben ArithmeticException.class als Ursache für die Ausnahme angegeben.

Sobald wir die zugrunde liegende Ausnahme erhalten haben, können wir sie erneut auslösen, in eine benutzerdefinierte Ausnahme einschließen oder die Ausnahme einfach basierend auf unserer Anforderung protokollieren.

4. Fazit

In diesem kurzen Artikel haben wir gesehen, wie die Reflexionsebene eine zugrunde liegende Ausnahme umschließt. Wir haben auch gesehen, wie die zugrunde liegende Ursache der InvocationTargetException ermittelt und ein solches Szenario anhand eines einfachen Beispiels behandelt wird.

Der in diesem Artikel verwendete Code ist wie üblich über GitHub verfügbar.