The Wyjątek InvocationTargetException jest sprawdzonym wyjątkiem, który przechowuje wyjątek zgłoszony przez wywołaną metodę lub konstruktora. Od wersji JDK 1.4 ten wyjątek został zmodernizowany, aby był zgodny z mechanizmem łączenia wyjątków ogólnego przeznaczenia. „Wyjątek docelowy”, który jest udostępniany w czasie konstruowania i do którego można uzyskać dostęp za pomocą metody getTargetException(), jest teraz znany jako przyczyna i można uzyskać do niego dostęp za pomocą metody Throwable.getCause() oraz „starszej metody”.
W skrócie, gdy wywołujemy klasę za pomocą metody Method.invoke(), zgłasza ona wyjątek; jest owinięty przez java.lang.reflect.InvocationTargetException klasa.
Przyczyna wyjątku InvokationTargetException
Wyjątek InvokationTargetException występuje głównie podczas pracy z Jawa Reflection API i spróbuj wywołać metodę lub konstruktor w warstwie odbicia, który sam zgłasza podstawowy wyjątek.
Warstwa odbicia przechowuje rzeczywisty wyjątek zgłoszony przez metody domyślne.
Jak rozwiązać wyjątek java.lang.reflect.InvocationTargetException
Wyjątek InvocationTargetException jest spowodowany wywołaną metodą, która zgłasza wyjątek. Podstawowy wyjątek można znaleźć za pomocą metody getCause(). Dlatego konieczne jest znalezienie rzeczywistego wyjątku i rozwiązanie go, aby rozwiązać wyjątek InvocationTargetException.
Rozważmy poniższy przykład, który celowo generuje wyjątek (dzielenie przez zero) w metodzie Demo(), która jest wywoływana przy użyciu metody Method.invoke(). Zatem dane wyjściowe zgłoszą zarówno wyjątek AirthmeticException (DividebyZero), jak i 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); } }
Wyjście:
Wrapper exception: java.lang.reflect.InvocationTargetException Underlying exception: java.lang.ArithmeticException: / by zero