Hva forårsaker java.lang.reflect.InvocationTargetException?

1. Oversikt

Når du jobber med Java Reflection API, er det vanlig å møte java.lang.reflect.InvocationTargetException. I denne veiledningen tar vi en titt på det og hvordan vi håndterer det med et enkelt eksempel.

2. På grunn av InvocationTargetException

Det skjer hovedsakelig når vi jobber med refleksjonslaget og prøver å påkalle en metode eller konstruktør som kaster et underliggende unntak i seg selv.

Refleksjonslaget bryter det faktiske unntaket som kastes av metoden med InvocationTargetException. La oss prøve å forstå det med et eksempel.

La oss skrive en klasse med en metode som med vilje gir et unntak:

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

La oss påkalle metoden ovenfor ved hjelp av refleksjon i en enkel JUnit 5-test:

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

I koden ovenfor har vi hevdet InvocationTargetException, som kastes mens man påkaller metoden. En viktig ting å merke seg her er at det faktiske unntaket - Aritmetisk unntak i dette tilfellet - blir pakket inn i en InvocationTargetException.

Nå er spørsmålet som kommer opp i tankene, hvorfor refleksjon ikke kaster det faktiske unntaket i utgangspunktet?

Årsaken er at den lar oss forstå om Unntak skjedde på grunn av feil i å ringe metoden gjennom refleksjonslaget eller om den skjedde innenfor selve metoden.

3. Hvordan håndtere InvocationTargetException?

Her er det faktiske underliggende unntaket årsaken til InvocationTargetException, det kan vi bruk Throwable.getCause () for å få mer informasjon om det.

La oss se hvordan vi kan bruke getCause () for å få det faktiske unntaket i det samme eksemplet som brukes ovenfor:

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

Her har vi brukt getCause () metode på det samme unntak gjenstand som ble kastet. Og vi har hevdet ArithmeticException.class som årsak til unntaket.

Så når vi får det underliggende unntaket, kan vi kaste det samme på nytt, pakke det inn i et eller annet tilpasset unntak, eller bare logge unntaket basert på vårt krav.

4. Konklusjon

I denne korte artikkelen har vi sett hvordan refleksjonslaget omslutter ethvert underliggende unntak. Vi har også sett hvordan vi kan bestemme den underliggende årsaken til InvocationTargetException og hvordan man håndterer et slikt scenario med et enkelt eksempel.

Som vanlig er koden som brukes i denne artikkelen tilgjengelig på GitHub.


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