The InvocationTargetException je kontrolovaná výnimka, ktorá obsahuje výnimku vyvolanú vyvolanou metódou alebo konštruktorom. Od JDK 1.4 bola táto výnimka dodatočne vybavená, aby zodpovedala všeobecnému mechanizmu reťazenia výnimiek. „Cieľová výnimka“, ktorá je poskytovaná v čase konštrukcie a ku ktorej sa pristupuje prostredníctvom metódy getTargetException(), je teraz známa ako príčina a možno k nej pristupovať prostredníctvom metódy Throwable.getCause(), ako aj prostredníctvom „starej metódy“.
Stručne povedané, keď vyvoláme triedu pomocou metódy Method.invoke(), vyvolá výnimku; je zabalený do java.lang.reflect.InvocationTargetException trieda.
Príčina InvokationTargetException
Výnimka InvokationTargetException sa vyskytuje hlavne pri práci s Java Reflection API a pokúste sa vyvolať metódu alebo konštruktor v reflexnej vrstve, ktorá vyvoláva samotnú základnú výnimku.
Reflexná vrstva obsahuje skutočnú výnimku vyvolanú predvolenými metódami.
Ako vyriešiť java.lang.reflect.InvocationTargetException
Výnimka InvocationTargetException je spôsobená vyvolanou metódou, ktorá vyvolá výnimku. Základnú výnimku možno nájsť pomocou metódy getCause(). Preto je potrebné nájsť skutočnú výnimku a vyriešiť ju, aby sa vyriešila výnimka InvocationTargetException.
Uvažujme nižšie uvedený príklad, ktorý zámerne generuje výnimku (delenú nulou) v metóde Demo(), ktorá je vyvolaná pomocou Method.invoke(). Výstup teda vyvolá výnimku AirthmeticException (DividebyZero) aj výnimku InvokationTargetException.
TestInvokationException.java:
import java.lang.reflect.Method; public class TestInvocationException { public static void main(String[] args) { TargetInvocation ti = new TargetInvocation(); // Accessing all the methods of TargetInvocationClass: Method[] m = TargetInvocation.class.getMethods(); try { // Invoking the first method of the TargetInvocatioClass: m[0].invoke(ti); } catch(Exception e) { // Printing the wrapper exception: System.out.println('Wrapper exception: ' + e); // Printing the 'actual' exception: System.out.println('Underlying exception: ' + e.getCause()); } } } class TargetInvocation{ public void Demo() { // Dividing by zero to intentionally throw an exception: System.out.println(10 / 0); } }
Výkon:
Wrapper exception: java.lang.reflect.InvocationTargetException Underlying exception: java.lang.ArithmeticException: / by zero