The InvocationTargetException yra pažymėta išimtis, kurioje yra iškviesto metodo arba konstruktoriaus pateikta išimtis. Nuo JDK 1.4 ši išimtis buvo modifikuota, kad atitiktų bendrosios paskirties išimčių grandinės mechanizmą. „Tikslinė išimtis“, kuri pateikiama statybos metu ir pasiekiama naudojant getTargetException() metodą, dabar žinoma kaip priežastis ir gali būti pasiekiama naudojant Throwable.getCause() metodą, taip pat „seną metodą“.
Trumpai tariant, kai iškviečiame klasę naudodami Method.invoke(), ji pateikia išimtį; jį apvynioja java.lang.reflect.InvocationTargetException klasė.
InvokationTargetException priežastis
InvokationTargetException dažniausiai atsiranda dirbant su Java Reflection API ir pabandykite iškviesti metodą arba konstruktorių atspindžio sluoksnyje, kuris pats sukuria pagrindinę išimtį.
Atspindėjimo sluoksnyje yra tikroji išimtis, išmesta pagal numatytuosius metodus.
Kaip išspręsti java.lang.reflect.InvocationTargetException
InvocationTargetException sukelia iškviestas metodas, kuris sukuria išimtį. Pagrindinę išimtį galima rasti naudojant getCause() metodą. Todėl būtina rasti tikrąją išimtį ir ją išspręsti, kad būtų išspręsta InvocationTargetException.
Apsvarstykite toliau pateiktą pavyzdį, kuris sąmoningai generuoja išimtį (padalijimas iš nulio) metodu Demo(), kuris iškviečiamas naudojant Method.invoke(). Taigi išvestis išmes ir AirthmeticException (DividebyZero), ir 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); } }
Išvestis:
Wrapper exception: java.lang.reflect.InvocationTargetException Underlying exception: java.lang.ArithmeticException: / by zero