logo

InvocationTargetException

De InvocationTargetException är ett kontrollerat undantag som innehåller ett undantag som skapats av en anropad metod eller konstruktor. Sedan JDK 1.4 har detta undantag eftermonterats för att överensstämma med den allmänna mekanismen för undantagskedja. 'Target-undantaget' som tillhandahålls vid konstruktionstidpunkten och som nås via metoden getTargetException() är nu känt som orsaken och kan nås via metoden Throwable.getCause() såväl som 'legacy-metoden'.

Kort sagt, när vi anropar en klass med hjälp av Method.invoke(), skapar den ett undantag; den är inslagen av java.lang.reflect.InvocationTargetException klass.

Orsak till InvokationTargetException

InvokationTargetException uppstår huvudsakligen när du arbetar med Java Reflection API och försök anropa en metod eller konstruktor i reflektionsskiktet som kastar ett underliggande undantag själv.

Reflexionsskiktet innehåller det faktiska undantaget som skapas av standardmetoderna.

Så här löser du java.lang.reflect.InvocationTargetException

InvocationTargetException orsakas av den anropade metoden, som ger ett undantag. Det underliggande undantaget kan hittas med metoden getCause(). Därför är det nödvändigt att hitta det faktiska undantaget och lösa det för att lösa InvocationTargetException.

InvocationTargetException

Betrakta exemplet nedan, som avsiktligt genererar ett undantag (dividera med noll) i metoden Demo(), som anropas med metoden Method.invoke(). Således kommer utdata att kasta både AirthmeticException (DividebyZero) och 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