Ce cauzează java.lang.reflect.InvocationTargetException?

1. Prezentare generală

Când lucrați cu Java Reflection API, este obișnuit să întâlniți java.lang.reflect.InvocationTargetException . În acest tutorial, vom arunca o privire asupra acestuia și cum să îl gestionăm cu un exemplu simplu .

2. Cauza excepției InvocationTargetException

Apare în principal atunci când lucrăm cu stratul de reflecție și încercăm să invocăm o metodă sau un constructor care aruncă însăși o excepție de bază.

Stratul de reflecție împachetează excepția reală aruncată de metodă cu InvocationTargetException . Să încercăm să o înțelegem cu un exemplu.

Să scriem o clasă cu o metodă care aruncă în mod intenționat o excepție:

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

Acum, să invocăm metoda de mai sus folosind reflecția într-un test simplu JUnit 5:

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

În codul de mai sus, am afirmat InvocationTargetException , care este aruncată în timp ce invocăm metoda. Un lucru important de remarcat aici este că excepția reală - ArithmeticException în acest caz - este înfășurată într-o InvocationTargetException.

Acum, întrebarea care îmi vine în minte este, de ce reflecția nu aruncă în primul rând excepția reală?

Motivul este că ne permite să înțelegem dacă Excepția a avut loc din cauza eșecului apelării metodei prin stratul de reflecție sau dacă a avut loc în cadrul metodei în sine.

3. Cum să gestionați InvocationTargetException ?

Aici, excepția reală de bază este cauza InvocationTargetException , deci putem folosi Throwable.getCause () pentru a obține mai multe informații despre aceasta.

Să vedem cum putem folosi getCause () pentru a obține excepția reală în același exemplu folosit mai sus:

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

Aici am folosit metoda getCause () pe același obiect de excepție care a fost aruncat. Și am afirmat ArithmeticException.class ca fiind cauza excepției.

Deci, odată ce obținem excepția subiacentă, putem să o aruncăm la fel, să o înfășurăm într-o excepție personalizată sau pur și simplu să înregistrăm excepția pe baza cerințelor noastre.

4. Concluzie

În acest scurt articol, am văzut cum stratul de reflecție împachetează orice excepție subiacentă. De asemenea, am văzut cum să determinăm cauza care stă la baza InvocationTargetException și cum să gestionăm un astfel de scenariu cu un exemplu simplu.

Ca de obicei, codul utilizat în acest articol este disponibil pe GitHub.