logo

InvocationTargetException

Det InvocationTargetException er en kontrolleret undtagelse, der indeholder en undtagelse, der er smidt af en påberåbt metode eller konstruktør. Siden JDK 1.4 er denne undtagelse blevet eftermonteret for at være i overensstemmelse med den generelle undtagelses-kædemekanisme. 'Target-undtagelsen', der leveres på konstruktionstidspunktet og tilgås via getTargetException()-metoden, er nu kendt som årsagen og kan tilgås via Throwable.getCause()-metoden, såvel som 'legacy-metoden'.

I en nøddeskal, når vi kalder en klasse ved hjælp af Method.invoke(), kaster den en undtagelse; den er pakket ind af java.lang.reflect.InvocationTargetException klasse.

Årsag til InvokationTargetException

InvokationTargetException opstår hovedsageligt, mens du arbejder med Java Reflection API og prøv at påkalde en metode eller konstruktør i reflektionslaget, der selv kaster en underliggende undtagelse.

Refleksionslaget indeholder den faktiske undtagelse, der er smidt af standardmetoderne.

Sådan løser du java.lang.reflect.InvocationTargetException

InvocationTargetException er forårsaget af den påkaldte metode, som kaster en undtagelse. Den underliggende undtagelse kan findes ved hjælp af getCause() metoden. Derfor er det nødvendigt at finde den faktiske undtagelse og løse den for at løse InvocationTargetException.

Sridevi
InvocationTargetException

Overvej nedenstående eksempel, som med vilje genererer en undtagelse (divider med nul) i metoden Demo(), som påkaldes ved hjælp af Method.invoke(). Således vil outputtet kaste både AirthmeticException (DividebyZero) og 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); } } 

Produktion:

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