一文深入理解Java中的java.lang.reflect.InvocationTargetException错误
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()); } } }
输出:
java.lang.ArithmeticException: / by zero
在上面的输出中,实际的底层异常是 ArithmeticException,因为我们除以零而发生。
一旦我们修复了底层异常,InitationTargetException 也得到了解决。 以下是完整的工作代码,无一例外; 我们刚刚删除了除以零的部分。
完整源代码:
import java.lang.reflect.*; public class Test { public int divideByZero() { return 89/ 9; } 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 中使用反射层时如何包装底层异常。 我们了解了在使用 java.lang.reflect.InitationTargetException
时如何获取底层异常以及如何解决它。
到此这篇关于Java中java.lang.reflect.InvocationTargetException错误的文章就介绍到这了,更多相关java.lang.reflect.InvocationTargetException错误内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java 中 String,StringBuffer 和 StringBuilder 的区别及用法
这篇文章主要介绍了Java 中 String,StringBuffer 和 StringBuilder 的区别及用法的相关资料,需要的朋友可以参考下2017-03-03
最新评论