logo

InvocationTargetException

El InvocationTargetException és una excepció marcada que conté una excepció llançada per un mètode o constructor invocat. Des del JDK 1.4, aquesta excepció s'ha adaptat per adaptar-se al mecanisme d'encadenament d'excepcions de propòsit general. L''excepció objectiu' que es proporciona en el moment de la construcció i a la qual s'accedeix mitjançant el mètode getTargetException() ara es coneix com a causa i es pot accedir mitjançant el mètode Throwable.getCause(), així com el 'mètode heretat'.

En poques paraules, quan invoquem una classe utilitzant el Method.invoke(), llança una excepció; està embolicat pel java.lang.reflect.InvocationTargetException classe.

Causa de l'excepció InvokationTargetException

L'excepció InvokationTargetException es produeix principalment mentre es treballa amb el Java Reflection API i intenteu invocar un mètode o un constructor a la capa de reflexió que llança una excepció subjacent.

La capa de reflexió conté l'excepció real llançada pels mètodes predeterminats.

Com resoldre java.lang.reflect.InvocationTargetException

L'excepció InvocationTargetException és causada pel mètode invocat, que llança una excepció. L'excepció subjacent es pot trobar mitjançant el mètode getCause(). Per tant, cal trobar l'excepció real i resoldre-la per resoldre l'excepció InvocationTargetException.

InvocationTargetException

Considereu l'exemple següent, que genera intencionadament una excepció (divideix per zero) al mètode Demo(), que s'invoca amb Method.invoke(). Així, la sortida llançarà tant l'AirthmeticException (DividebyZero) com l'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); } } 

Sortida:

 Wrapper exception: java.lang.reflect.InvocationTargetException Underlying exception: java.lang.ArithmeticException: / by zero