The InvocationTargetException е проверено изключение, което съдържа изключение, хвърлено от извикан метод или конструктор. От JDK 1.4 това изключение е преоборудвано, за да съответства на механизма за верижно свързване на изключения с общо предназначение. „Целевото изключение“, което се предоставя по време на конструиране и достъпно чрез метода getTargetException(), сега е известно като причина и може да бъде достъпно чрез метода Throwable.getCause(), както и „наследения метод“.
С две думи, когато извикаме клас с помощта на Method.invoke(), той хвърля изключение; тя е обвита от java.lang.reflect.InvocationTargetException клас.
Причина за InvokationTargetException
Изключението InvokationTargetException възниква главно при работа с Java API за отражение и опитайте да извикате метод или конструктор в слоя за отражение, който сам хвърля основно изключение.
Отражателният слой съдържа действителното изключение, хвърлено от методите по подразбиране.
Как да разрешите java.lang.reflect.InvocationTargetException
Изключението InvocationTargetException се причинява от извикания метод, който хвърля изключение. Основното изключение може да бъде намерено с помощта на метода getCause(). Следователно е необходимо да се намери действителното изключение и да се разреши, за да се разреши InvocationTargetException.
Разгледайте примера по-долу, който умишлено генерира изключение (разделяне на нула) в метода Demo(), който се извиква с помощта на Method.invoke(). По този начин изходът ще хвърли както AirthmeticException (DividebyZero), така и InvokationTargetException.
TestInvokationException.java:
изтегляне на видео от youtube с vlc
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); } }
Изход:
Wrapper exception: java.lang.reflect.InvocationTargetException Underlying exception: java.lang.ArithmeticException: / by zero