Mi okozza a java.lang.reflect.InvocationTargetException alkalmazást?

1. Áttekintés

Amikor a Java Reflection API-val dolgozik, gyakran találkozunk java.lang.reflect.InvocationTargetException. Ebben az oktatóanyagban egy egyszerű példával vesszük szemügyre, és hogyan kezeljük.

2. Miatt InvocationTargetException

Főleg akkor fordul elő, amikor a reflexiós réteggel dolgozunk, és megpróbálunk meghívni egy olyan módszert vagy konstruktort, amely maga vet egy mögöttes kivételt.

A reflexiós réteg a metódus által eldobott tényleges kivételt beburkolja az InvocationTargetException alkalmazással. Próbáljuk megérteni egy példával.

Írjunk osztályt olyan módszerrel, amely szándékosan kivételt hoz:

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

Most hívjuk meg a fenti módszert reflexió segítségével egy egyszerű JUnit 5 tesztben:

InvocationTargetExample targetExample = new InvocationTargetExample (); Method method = InvocationTargetExample.class.getMethod ("divideByZeroExample"); Kivétel kivétel = assertThrows (InvocationTargetException.class, () -> method.invoke (targetExample));

A fenti kódban állítottuk a InvocationTargetException, amelyet a módszer meghívása közben dobnak el. Fontos megjegyezni, hogy a tényleges kivétel - Számtani kivétel ebben az esetben - belekerül egy InvocationTargetException.

Most az a kérdés merül fel bennünk, hogy a reflexió miért nem dobja eleve a tényleges kivételt?

Ennek oka, hogy lehetővé teszi számunkra, hogy megértsük, hogy a Kivétel a metódus reflexiós rétegen keresztüli behívásának sikertelensége miatt következett be, vagy pedig magában a módszerben történt.

3. Hogyan kell kezelni InvocationTargetException?

Itt a tényleges mögöttes kivétel az oka InvocationTargetException, Szóval mi tudunk használat Throwable.getCause () hogy további információkat szerezzenek róla.

Lássuk, hogyan tudjuk használni getCause () hogy a tényleges kivételt megkapjuk a fenti példában:

assertEquals (ArithmeticException.class, kivétel.getCause (). getClass ());

Itt használtuk a getCause () módszer ugyanazon kivétel dobott tárgy. És állítottuk ArithmeticException.osztály mint a kivétel oka.

Tehát, ha megkapjuk a mögöttes kivételt, újra dobhatjuk ugyanezt, beburkolhatjuk valamilyen egyedi kivételbe, vagy egyszerűen naplózhatjuk a kivételt a követelményünk alapján.

4. Következtetés

Ebben a rövid cikkben láthattuk, hogy a visszaverődési réteg hogyan burkolja a mögöttes kivételeket. Láttuk azt is, hogyan lehet meghatározni a InvocationTargetException és hogyan kezelhető egy ilyen forgatókönyv egyszerű példával.

Szokás szerint az ebben a cikkben használt kód elérhető a GitHubon.