Vad orsakar java.lang.reflect.InvocationTargetException?

1. Översikt

När du arbetar med Java Reflection API är det vanligt att stöta på java.lang.reflect.InvocationTargetException . I den här handledningen tar vi en titt på det och hur man hanterar det med ett enkelt exempel .

2. Orsak till InvocationTargetException

Det inträffar främst när vi arbetar med reflektionsskiktet och försöker åberopa en metod eller konstruktör som kastar ett underliggande undantag.

Reflektionsskiktet omsluter det verkliga undantaget som kastas av metoden med InvocationTargetException . Låt oss försöka förstå det med ett exempel.

Låt oss skriva en klass med en metod som avsiktligt ger ett undantag:

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

Låt oss nu åberopa metoden ovan med hjälp av reflektion i ett enkelt JUnit 5-test:

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

I koden ovan har vi hävdat InvocationTargetException , som kastas när man anropar metoden. En viktig sak att notera här är att det faktiska undantaget - ArithmeticException i det här fallet - slås in i ett InvocationTargetException.

Nu är frågan som kommer att tänka på varför kastar inte reflektion det faktiska undantaget i första hand?

Anledningen är att det tillåter oss att förstå om undantaget inträffade på grund av misslyckande med att anropa metoden genom reflektionsskiktet eller om det inträffade inom själva metoden.

3. Hur hanterar jag InvocationTargetException ?

Här är det faktiska underliggande undantaget orsaken till InvocationTargetException , så vi kan använda Throwable.getCause () för att få mer information om det.

Låt oss se hur vi kan använda getCause () för att få det verkliga undantaget i samma exempel som används ovan:

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

Här har vi använt getCause () -metoden på samma undantagsobjekt som kastades. Och vi har hävdat ArithmeticException.class som orsak till undantaget.

Så när vi har fått det underliggande undantaget kan vi kasta igen samma, slå in det i något anpassat undantag eller helt enkelt logga undantaget baserat på vårt krav.

4. Slutsats

I den här korta artikeln har vi sett hur reflektionsskiktet omsluter alla underliggande undantag. Vi har också sett hur man bestämmer den bakomliggande orsaken till InvocationTargetException och hur man hanterar ett sådant scenario med ett enkelt exempel.

Som vanligt finns koden i den här artikeln tillgänglig på GitHub.