IL InvocationTargetException è un'eccezione verificata che contiene un'eccezione lanciata da un metodo o costruttore richiamato. A partire da JDK 1.4, questa eccezione è stata adattata per conformarsi al meccanismo di concatenamento delle eccezioni di uso generale. L''eccezione di destinazione' fornita in fase di costruzione e a cui si accede tramite il metodo getTargetException() è ora nota come causa ed è possibile accedervi tramite il metodo Throwable.getCause(), nonché il 'metodo legacy'.
In poche parole, quando invochiamo una classe utilizzando Method.invoke(), lancia un'eccezione; è avvolto dal java.lang.reflect.InvocationTargetException classe.
Causa dell'eccezione InvokationTargetException
L'InvokationTargetException si verifica principalmente mentre si lavora con il file Giava API Reflection e provare a richiamare un metodo o un costruttore nel livello di riflessione che genera esso stesso un'eccezione sottostante.
Il livello di riflessione contiene l'effettiva eccezione lanciata dai metodi predefiniti.
Come risolvere l'eccezione java.lang.reflect.InvocationTargetException
L'InvocationTargetException è causata dal metodo richiamato, che genera un'eccezione. L'eccezione sottostante può essere trovata utilizzando il metodo getCause(). Pertanto, è necessario trovare l'eccezione effettiva e risolverla per risolvere InvocationTargetException.
Considera l'esempio seguente, che genera intenzionalmente un'eccezione (divisione per zero) nel metodo Demo(), che viene richiamato utilizzando Method.invoke(). Pertanto, l'output genererà sia AirthmeticException (DividebyZero) che InvokationTargetException.
TestInvokationException.java:
tigre rispetto al leone
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); } }
Produzione:
Wrapper exception: java.lang.reflect.InvocationTargetException Underlying exception: java.lang.ArithmeticException: / by zero