看啥推荐读物
专栏名称: 山花
解梦姻缘测字寻失
目录
相关文章推荐
今天看啥  ›  专栏  ›  山花

5.2 什么会导致java.lang.reflect.InvocationTargetException?| Java Debug 笔记

山花  · 掘金  ·  · 2021-05-15 09:41
阅读 20

5.2 什么会导致java.lang.reflect.InvocationTargetException?| Java Debug 笔记

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

*提问:什么会导致java.lang.reflect.InvocationTargetException? *

我试图理解并阅读可能导致它的原因,但我却无法理解我的代码中有这个地方:

 try{
 ..
 m.invoke(testObject);
 ..
 } catch(AssertionError e){
 ...
 } catch(Exception e){
 ..
 }
复制代码

事实是,当它尝试调用某个方法时,它会抛出InvocationTargetException而不是其他预期的异常(特别是ArrayIndexOutOfBoundsException)引发 。由于我实际上知道调用了哪种方法,所以我直接转到此方法代码,并为应该抛出的行添加了一个try-catch块 ArrayIndexOutOfBoundsException,它确实ArrayIndexOutOfBoundsException按预期抛出了。然而,当它上升时,它会以某种方式更改为InvocationTargetException,并且在上面的代码中catch(Exception e)e是InvocationTargetException而不是预期的ArrayIndexOutOfBoundsException。

是什么原因导致这种行为的?我该如何检查?

回答1: 通过使用反射调用方法,您已经添加了额外的抽象级别。 反射层将任何异常包装在InvocationTargetException中,该异常使您可以分辨出反射调用失败(例如,您的参数列表无效)实际导致的异常与所调用方法中的失败之间的区别。

只需在InvocationTargetException中展开原因,就可以找到原来的原因。

回答2:

这个异常会被抛出在如下情况:

InvocationTargetException - 如果基础方法引发异常。
复制代码

因此,如果已使用反射API调用的方法抛出异常(例如,运行时异常),则反射API会将异常包装到InvocationTargetException中。

使用InvocationTargetException中的getCause()方法检索原始异常。




原文地址:访问原文地址
快照地址: 访问文章快照