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.