Java 中的 java.lang.reflect.InitationTargetException 错误

当开发人员使用 Java Reflection API 时,java.lang.reflect.InitationTargetException 是一个非常常见的异常。 检查的异常保存由调用的方法或构造函数抛出的异常。


从 JDK 1.4 版本开始,该异常已被改进以符合通用异常链机制。 简而言之,每当开发人员尝试使用 Method.invoke() 调用一个类时,我们都会收到 InvocableTargetException ,并且它被 java.lang.reflect.InvokeTargetException 包裹。


java.lang.reflect.InvocableTargetException错误的原因

IncationTargetException 主要发生在开发人员使用反射层并尝试调用本身引发底层异常的构造函数或方法时。 因此,Java 反射 API 将方法抛出的异常包装为 InvoicationTargetException。


让我们看一个代码示例来更好地理解它。


示例代码:


import java.lang.reflect.*;


public class Test {

   public int divideByZero() {

       return 89/ 0;

   }


   public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException {

       Test obj = new Test();

       Method method = Test.class.getMethod("divideByZero");

       try {

           method.invoke(obj);

       } catch (InvocationTargetException e) {

           e.printStackTrace();

       }

   }

}


输出:


java.lang.reflect.InvocationTargetException

   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)

   at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

   at java.base/java.lang.reflect.Method.invoke(Method.java:568)

   at Test.main(Test.java:13)

Caused by: java.lang.ArithmeticException: / by zero

   at Test.divideByZero(Test.java:6)

   ... 5 more


修复 Java 中的 java.lang.reflect.InitationTargetException 错误

根据上面的内容,我们了解到底层异常是导致 java.lang.reflect.InitationTargetException 错误的原因。 我们可以使用 Throwable 类的 getCause() 方法获取有关底层异常的更多信息。


因此,解决 IncationTargetException 涉及查找并解决底层异常。


示例代码:


import java.lang.reflect.*;


public class Test {

   public int divideByZero() {

       return 89/ 0;

   }


   public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException

   {

       Test obj = new Test();

       Method method = Test.class.getMethod("divideByZero");

       try {

           method.invoke(obj);

       }

       catch (InvocationTargetException e)

       {

           System.out.println(e.getCause());

       }

   }

}