Što uzrokuje java.lang.reflect.InvocationTargetException?

1. Pregled

Kada radite s Java Reflection API-om, uobičajeno je naići java.lang.reflect.InvocationTargetException. U ovom ćemo ga priručniku pogledati i kako postupati s njim na jednostavnom primjeru.

2. Zbog InvocationTargetException

To se uglavnom događa kada radimo s reflektirajućim slojem i pokušavamo prizvati metodu ili konstruktor koji sam baci temeljnu iznimku.

Refleksijski sloj omotava stvarnu iznimku koju je izbacila metoda s InvocationTargetException. Pokušajmo to razumjeti na primjeru.

Napišimo klasu metodom koja namjerno baca iznimku:

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

Sada ćemo se pozvati na gornju metodu pomoću refleksije u jednostavnom testu JUnit 5:

InvocationTargetExample targetExample = novi InvocationTargetExample (); Metoda metode = InvocationTargetExample.class.getMethod ("divideByZeroExample"); Iznimka iznimka = assertThrows (InvocationTargetException.class, () -> method.invoke (targetExample));

U gore navedenom kodu ustvrdili smo InvocationTargetException, koji se baca dok se poziva metoda. Ovdje je važno napomenuti da je stvarna iznimka - ArithmeticException u ovom slučaju - zamota se u InvocationTargetException.

E sad, pitanje koje mi pada na pamet je, zašto razmišljanje uopće ne baci stvarnu iznimku?

Razlog je taj što nam omogućuje da shvatimo je li Iznimka nastao zbog neuspjeha u pozivanju metode kroz reflektirajući sloj ili zbog toga što se dogodio unutar same metode.

3. Kako postupati InvocationTargetException?

Ovdje je stvarna temeljna iznimka uzrok InvocationTargetException, tako da možemo koristiti Throwable.getCause () da biste dobili više informacija o tome.

Pogledajmo kako se možemo koristiti getCause () da biste dobili stvarnu iznimku u istom primjeru gore korištenom:

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

Evo, koristili smo getCause () metoda na istom iznimka predmet koji je bačen. I ustvrdili smo ArithmeticException.class kao uzrok iznimke.

Dakle, nakon što dobijemo temeljnu iznimku, možemo je ponovno baciti, umotati u neku prilagođenu iznimku ili jednostavno zabilježiti iznimku na temelju našeg zahtjeva.

4. Zaključak

U ovom kratkom članku vidjeli smo kako reflektirajući sloj obavija bilo koju temeljnu iznimku. Također smo vidjeli kako utvrditi osnovni uzrok InvocationTargetException i kako se na jednostavnom primjeru nositi s takvim scenarijem.

Kao i obično, kôd korišten u ovom članku dostupan je na GitHubu.