好吧,我试图了解并阅读可能导致它的原因,但我无法得到它:
我的代码中有这个地方:
try{
..
m.invoke(testObject);
..
} catch(AssertionError e){
...
} catch(Exception e){
..
}
事实是,当它试图调用某个方法时,它会抛出 InvocationTargetException
而不是其他一些预期的异常(特别是 ArrayIndexOutOfBoundsException
) . 因为我实际上知道调用了什么方法,所以我直接使用了这个方法代码并为假设抛出 ArrayIndexOutOfBoundsException
的行添加了一个try-catch块,它确实按预期抛出 ArrayIndexOutOfBoundsException
. 然而,当它上升时,它会以某种方式更改为 InvocationTargetException
并且在上面的代码中 InvocationTargetException
并且 InvocationTargetException
而不是 ArrayIndexOutOfBoundsException
.
什么可能导致这样的行为或我如何检查这样的事情?
13 回答
从Eclipse Navigator模式列出所有jar文件
验证所有jar文件是否处于二进制模式
在我执行Clean-> Run xDoclet-> Run xPackaging后,错误消失了 .
在我的工作区中,在ecllipse中 .
您通过使用反射调用方法添加了额外的抽象级别 . 反射层包装
InvocationTargetException
中的任何异常,这使您可以区分实际由反射调用中的失败引起的异常(例如,您的参数列表无效)和被调用方法中的失败 .只需打开
InvocationTargetException
中的原因,你就会得到原始的原因 .如果抛出异常
因此,如果使用反射API调用的方法抛出异常(例如运行时异常),则反射API会将异常包装到_1036620中 .
使用
InvocationTargetException
上的getCause()
方法检索原始异常 .来自Method.invoke()的Javadoc
如果调用的方法引发异常,则抛出此异常 .
这将打印特定方法中的确切代码行,在调用时会引发异常:
InvocationTargetException
可能正在收拾你的ArrayIndexOutOfBoundsException
. 在使用反射时,没有预先知道该方法可以抛出什么 - 所以不是使用throws Exception
方法,所有异常都被捕获并包含在InvocationTargetException
中 .This描述的东西,
您可以使用getCause()方法与原始异常类进行比较,如下所示:
我在
class
中的try
/catch
块内的外部class
中调用了一个 Logger 对象的语句中出现java.lang.reflect.InvocationTargetException
错误 .逐步执行Eclipse调试器中的代码并将鼠标悬停在logger语句上,我看到 Logger
object
是null
(需要在class
的最顶部实例化一些外部常量) .如果底层方法(使用Reflection调用的方法)抛出异常,则抛出此异常 .
因此,如果由反射API调用的方法抛出异常(例如运行时异常),则反射API会将异常包装到InvocationTargetException中 .
我遇到了同样的问题 . 我使用了e.getCause() . getCause()然后我发现这是因为我传递了错误的参数 . 在获取其中一个参数的值时,存在nullPointerException . 希望这会帮助你 .