The InvocationTargetException je kontrolovaná výjimka, která obsahuje výjimku vyvolanou vyvolanou metodou nebo konstruktorem. Od verze JDK 1.4 byla tato výjimka upravena tak, aby odpovídala obecnému mechanismu řetězení výjimek. „Cílová výjimka“, která je poskytována v době výstavby a ke které se přistupuje prostřednictvím metody getTargetException(), je nyní známá jako příčina a lze k ní přistupovat pomocí metody Throwable.getCause() a také pomocí „starší metody“.
Stručně řečeno, když vyvoláme třídu pomocí metody Method.invoke(), vyvolá výjimku; je obalena tím java.lang.reflect.InvocationTargetException třída.
Příčina výjimky InvokationTargetException
Výjimka InvokationTargetException se vyskytuje hlavně při práci s Jáva Reflection API a pokuste se vyvolat metodu nebo konstruktor v reflexní vrstvě, která sama vyvolá základní výjimku.
Reflexní vrstva obsahuje skutečnou výjimku vyvolanou výchozími metodami.
Jak vyřešit java.lang.reflect.InvocationTargetException
Výjimka InvocationTargetException je způsobena vyvolanou metodou, která vyvolá výjimku. Základní výjimku lze nalézt pomocí metody getCause(). Proto je nutné najít skutečnou výjimku a vyřešit ji, aby se vyřešila výjimka InvocationTargetException.
Zvažte níže uvedený příklad, který záměrně generuje výjimku (děleno nulou) v metodě Demo(), která je vyvolána pomocí Method.invoke(). Výstup tedy vyvolá výjimku AirthmeticException (DividebyZero) i výjimku 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ýstup:
Wrapper exception: java.lang.reflect.InvocationTargetException Underlying exception: java.lang.ArithmeticException: / by zero