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 vejledning ser vi på det, og hvordan man håndterer det med et simpelt eksempel.

2. Årsag til InvocationTargetException

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

Refleksionslaget omvikler den faktiske undtagelse, der kastes af metoden, med InvocationTargetException. Lad os prøve at forstå det med et eksempel.

Lad os skrive en klasse med en metode, der bevidst kaster en undtagelse:

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

Lad os nu påkalde ovenstående metode ved hjælp af refleksion i en simpel JUnit 5-test:

InvocationTargetExample targetExample = ny InvocationTargetExample (); Metodemetode = InvocationTargetExample.class.getMethod ("divideByZeroExample"); Undtagelsesundtagelse = assertThrows (InvocationTargetException.class, () -> method.invoke (targetExample));

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

Nu er spørgsmålet, der kommer til at tænke på, hvorfor refleksion ikke kaster den faktiske undtagelse i første omgang?

Årsagen er, at det giver os mulighed for at forstå, om Undtagelse opstod på grund af manglende opkald af metoden gennem refleksionslaget, eller om den opstod inden for selve metoden.

3. Sådan håndteres InvocationTargetException?

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

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

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

Her har vi brugt getCause () metode på det 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 genkaste det samme, pakke det ind i en brugerdefineret undtagelse eller blot logge undtagelsen ud fra vores krav.

4. Konklusion

I denne korte artikel har vi set, hvordan refleksionslaget omslutter enhver underliggende undtagelse. Vi har også set, hvordan man kan bestemme 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.


$config[zx-auto] not found$config[zx-overlay] not found