本文正在参加「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()方法检索原始异常。