什么会导致java.lang.reflect.InvocationTargetException?
好吧,我已经试图了解和阅读可能导致这种情况的原因,但我就是无法理解。
我的代码里有这个地方。
try{
..
m.invoke(testObject);
..
} catch(AssertionError e){
...
} catch(Exception e){
..
}
问题是,当它试图调用某些方法时,会抛出
抛出 "InvocationTargetException "而不是其他预期的异常(特别是 "ArrayIndexOutOfBoundsException")。
因为我实际上知道调用的是什么方法,所以我直接进入这个方法的代码,并为假定抛出ArrayIndexOutOfBoundsException'的那一行添加了一个try-catch块,结果它真的如预期那样抛出了
ArrayIndexOutOfBoundsException'。然而,当往上走时,它
不知为何变成了InvocationTargetException
,在上面的代码中catch(Exception e)
,e是InvocationTargetException
。
e是InvocationTargetException
而不是ArrayIndexOutOfBoundsException
。
正如预期的那样。
什么原因会导致这样的行为,或者我如何检查这样的事情?
299
13
你用反射调用方法,增加了一个额外的抽象层次。反射层将任何异常包裹在 "InvocationTargetException "中,这可以让你区分由反射调用失败(例如,可能你的参数列表无效)引起的异常和被调用方法中的失败。
只要在 "InvocationTargetException "中解开原因,你就能找到原来的原因。
异常被抛出,如果
因此,如果被反射API调用的方法抛出了一个异常(例如运行时异常),反射API将把这个异常包装成一个`InvocationTargetException'。
在 "InvocationTargetException "上使用 "getCause() "方法来检索原始异常。
来自Method.invoke()的Javadoc
如果被调用的方法抛出了一个异常,就会抛出这个异常。
那个
InvocationTargetException
可能是在封装你的ArrayIndexOutOfBoundsException
。 在使用反射的时候,前期是无法知道那个方法能抛出什么的--所以与其使用throws Exception
的方法,不如用InvocationTargetException
来捕获和封装所有的异常。这将打印出特定方法中的准确代码行,当调用该方法时,会引发异常。
[这][1]描述的是:
>.InvocationTargetException InvocationTargetException是一个包裹了一个 >.是一个被调用的方法或构造函数引发的异常。 由一个被调用的方法或构造函数引发的异常。 从发布 1.4,这一例外情况已改为符合一般用途的例外连锁机制。 1.4,这个例外已经被改造成符合通用例外链机制。 的"目标异常"。 即
[1]: http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/InvocationTargetException.html
你可以用getCause()方法与原来的异常Class进行比较,像这样。
我在我的 "类 "中的 "try"/"catch "块中调用外部 "类 "中的记录器对象的语句出现了一个 "java.lang.reflect.InvocationTargetException "错误。
在Eclipse调试器中步入代码& 将鼠标悬停在logger语句上,我看到logger
object
是null
(一些外部常量需要在我的class
的顶部实例化)。如果底层方法(使用反射调用的方法)抛出一个异常,那么这个异常就会被抛出,所以如果被反射API调用的方法抛出一个异常(比如运行时异常),反射API会把这个异常封装成一个InvocationTargetException。
因此,如果被反射API调用的方法抛出一个异常(例如运行时异常),反射API将把这个异常包装成一个InvocationTargetException。
我也遇到了同样的问题,我用了e.getCause().getCause(),然后我发现是因为我传错了参数。 我使用e.getCause().getCause(),然后我发现是由于我传递的参数错误。 在获取其中一个参数的值时出现了nullPointerException。 希望能帮到你。
确认所有的jar文件都是二进制模式。
在我做了 Clean->运行xDoclet->运行xPackaging。
在我的工作区,在ecllipse中。