Java >> Java tutorial >  >> Tag >> java.lang

Hvad forårsager java.lang.reflect.InvocationTargetException?

1. Oversigt

Når du arbejder med Java Reflection API, er det almindeligt at støde på java.lang.reflect.InvocationTargetException .

I denne tutorial tager vi et kig på det, og hvordan man håndterer det med et simpelt eksempel.

2. Årsag til InvocationTargetException

Det sker hovedsageligt, når vi arbejder med reflektionslaget og forsøger at påkalde en metode eller konstruktør, der selv kaster en underliggende undtagelse.

Refleksionslaget omslutter den faktiske undtagelse, som frembringes af metoden med InvocationTargetException .

Lad os prøve at forstå det med et eksempel.

Vi skriver en klasse med en metode, der med vilje kaster en undtagelse:

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

Lad os påberåbe os ovenstående metode ved at bruge refleksion i en Simple JUnit 5-test:

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

I ovenstående kode har vi hævdet InvocationTargetException , som kastes, mens metoden påberåbes. En vigtig ting at bemærke her er, at den faktiske undtagelse — ArithmeticException i dette tilfælde – bliver pakket ind i en InvocationTargetException .

Nu, hvorfor kaster refleksion ikke den egentlige undtagelse i første omgang?

Årsagen er, at det giver os mulighed for at forstå, om Undtagelsen opstod på grund af fejl i at kalde metoden gennem reflektionslaget, eller om det forekom i selve metoden.

3. Sådan håndteres InvocationTargetException ?

Her er den faktiske underliggende undtagelse årsagen til InvocationTargetException , så vi kan bruge Throwable.getCause() for at få flere oplysninger om det.

Lad os se, hvordan vi kan bruge getCause() for at få den faktiske undtagelse i det samme eksempel brugt ovenfor:

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

Vi har brugt getCause() metode på samme undtagelse genstand, der blev kastet. Og vi har hævdet ArithmeticException.class som årsag til undtagelsen.

Så når vi først har fået den underliggende undtagelse, kan vi kaste den samme igen, pakke den ind i en tilpasset undtagelse eller blot logge undtagelsen baseret på vores krav.

4. Konklusion

I denne korte artikel så vi, hvordan reflektionslaget omslutter enhver underliggende undtagelse.

Vi så også, hvordan man bestemmer den underliggende årsag til InvocationTargetException og hvordan man håndterer et sådant scenario med et simpelt eksempel.

Som sædvanlig er koden, der bruges i denne artikel, tilgængelig på GitHub.


Java tag