好吧,我试图理解并阅读可能导致它的原因,但我无法理解它:
我的代码中有这个地方:
try{
..
m.invoke(testObject);
..
} catch(AssertionError e){
...
} catch(Exception e){
..
}
事情是,当它试图调用某个方法时它会抛出
InvocationTargetException
而不是其他预期的异常(特别是ArrayIndexOutOfBoundsException
)。
因为我实际上知道调用了什么方法,所以我直接使用了这个方法代码,并为假设抛出ArrayIndexOutOfBoundsException
的行添加了一个try-catch块,它确实按预期抛出了ArrayIndexOutOfBoundsException
。然而,当它上升
以某种方式更改为InvocationTargetException
和上面的代码catch(Exception e)
e是InvocationTargetException
而不是ArrayIndexOutOfBoundsException
如预期的那样。
什么可能导致这样的行为或我如何检查这样的事情?
答案 0 :(得分:301)
通过使用反射调用方法,您已经添加了额外的抽象级别。反射层包装InvocationTargetException
中的任何异常,这使您可以区分由反射调用失败导致的异常实际(可能您的参数列表无效,示例)和方法中的失败称为。
只需打开InvocationTargetException
内的原因,您就可以获得原始版本。
答案 1 :(得分:42)
如果
,则抛出异常InvocationTargetException - 如果基础方法抛出异常。
因此,如果使用反射API调用的方法抛出异常(例如运行时异常),则反射API会将异常包装到InvocationTargetException
。
答案 2 :(得分:42)
使用getCause()
上的InvocationTargetException
方法检索原始例外。
答案 3 :(得分:20)
来自Method.invoke()的Javadoc
抛出:InvocationTargetException - 如果基础方法抛出异常。
如果调用的方法引发异常,则抛出此异常。
答案 4 :(得分:9)
InvocationTargetException
可能正在结束你的ArrayIndexOutOfBoundsException
。在使用反射时,没有预先知道该方法可以抛出什么 - 所以不是使用throws Exception
方法,所有异常都被捕获并包含在InvocationTargetException
中。
答案 5 :(得分:9)
这将打印特定方法中的确切代码行,在调用时会引发异常:
try {
// try code
..
m.invoke(testObject);
..
} catch (InvocationTargetException e) {
// Answer:
e.getCause().printStackTrace();
} catch (Exception e) {
// generic exception handling
e.printStackTrace();
}
答案 6 :(得分:3)
This描述了类似的内容,
InvocationTargetException是一个包装了一个的已检查异常 被调用的方法或构造函数抛出的异常。截至发布 1.4,此异常已经过改进,以符合通用异常链机制。那是“目标异常” 在施工时提供并通过 getTargetException()方法现在称为原因,可能是 通过Throwable.getCause()方法访问,以及 上述“传统方法”。
答案 7 :(得分:1)
您可以使用getCause()方法与原始异常类进行比较,如下所示:
try{
...
} catch(Exception e){
if(e.getCause().getClass().equals(AssertionError.class)){
// handle your exception 1
} else {
// handle the rest of the world exception
}
}
答案 8 :(得分:1)
我的java.lang.reflect.InvocationTargetException
中的class
/ try
块内的外部catch
中的一个记录器对象调用了一个class
错误。 / p>
逐步完成Eclipse调试器和代码中的代码。将鼠标悬停在记录器语句上我看到记录器object
为null
(需要在class
的最顶部实例化一些外部常量)。
答案 9 :(得分:0)
如果底层方法(使用Reflection调用的方法)抛出异常,则抛出此异常。
因此,如果由反射API调用的方法抛出异常(例如运行时异常),则反射API会将异常包装到InvocationTargetException中。
答案 10 :(得分:0)
我遇到了同样的问题。我使用了e.getCause()。getCause()然后我发现它是因为我传递的错误参数。在获取其中一个参数的值时存在nullPointerException。 希望这会对你有所帮助。
答案 11 :(得分:-2)
答案 12 :(得分:-7)
我做错后消失了 清洁 - >运行xDoclet->运行xPackaging。
在我的工作区中,在ecllipse。