好吧,我试图理解和阅读可能导致它的原因,但我无法得到它:
我在我的代码中有这个地方:
1 2 3 4 5 6 7 8 9
| try{
..
m. invoke(testObject );
..
} catch(AssertionError e ){
...
} catch(Exception e ){
..
} |
事情就是,当它试图调用某个方法时它会抛出
InvocationTargetException而不是其他一些预期的异常(特别是ArrayIndexOutOfBoundsException)。
因为我实际上知道调用了什么方法,所以我直接使用了这个方法代码并为假设抛出ArrayIndexOutOfBoundsException的行添加了一个try-catch块,它确实按预期抛出了ArrayIndexOutOfBoundsException。 然而,当它上升
以某种方式更改为InvocationTargetException和上面的代码catch(Exception e)
e是InvocationTargetException而不是ArrayIndexOutOfBoundsException
正如所料。
什么可能导致这样的行为或我如何检查这样的事情?
您通过使用反射调用方法添加了额外的抽象级别。反射层包装InvocationTargetException中的任何异常,这使您可以区分实际由反射调用中的失败引起的异常(例如,您的参数列表无效)和被调用的方法中的失败。
只需打开InvocationTargetException中的原因,您就可以获得原始的原因。
-
谢谢,但是我如何区别(AssertionError e)和(例外e)?如果我在解开原因之前总是首先获得InvocationTargetException,那么每个异常之间我会有什么不同?
-
@ user550413:当然,通过展开异常并检查它。你总是可以自己扔它,如果你必须的话,就这样抓住它。
-
对于任何想知道"解开InvocationTargetException中的原因"意味着什么的人,我发现如果你用exception.printStackTrace()打印它,你只需看看"引起的:"部分而不是顶部半/正常部分。
-
要添加关于"展开"的说明,您还可以捕获异常并对其使用getCause()方法,如果需要,也可以重新抛出该方法。像try {...} catch (InvocationTargetException ex) { log.error("oops!", ex.getCause()) }或...catch... { throw ex.getCause() }之类的东西
-
+1 @HJanrs为you just look at the"Caused By:" section instead of the top half/normal section
-
@JonSkeet我在同事代码中查看同样的异常。我试图通过在try-catch块中包含对culprit类的调用来捕获异常。但令我们惊讶的是,它根本没有进入捕获区!有人能告诉我这里可能缺少什么。
-
@Pavan:真的不能说那么多的描述;我建议你尝试将它放在一个简短但完整的程序中,以重现问题,然后发布一个新问题。
-
在@jcadcell之前提到的内容中添加更多详细信息,请参阅此链接examples.javacodegeeks.com/java-basics/exceptions/
-
@DheraajBhaskar不要编辑其他人的答案,就像他们自己的答案一样,并且不要对未引用的文本使用引号格式。该编辑应该作为评论发布。
-
@EJP实际上,编辑已经由Jan发布为评论(68个赞成票)...编辑说明指定"从评论中获取建议"。
-
我有类似的问题,但无法解决它,我的问题在这里。请看看stackoverflow.com/questions/32709784/
-
InvocationTargetException总是有原因吗?
-
@ Jus12:你可以无原因地构造一个,但我相信invoke引发的一个总会有一个。
-
上面@ Jan的评论(看看堆栈跟踪的"引起的:"部分)应该是答案。
如果是,则抛出异常
InvocationTargetException - if the underlying method throws an exception.
因此,如果使用反射API调用的方法抛出异常(例如运行时异常),则反射API会将异常包装到InvocationTargetException中。
使用InvocationTargetException上的getCause()方法检索原始异常。
来自Method.invoke()的Javadoc
Throws: InvocationTargetException - if the underlying method throws an exception.
如果调用的方法引发异常,则抛出此异常。
-
所以想象一下,我有一个java.lang.reflect.Proxy实例的级联来扩充一个包装对象。每个Proxy通过使用自己的InvocationHandler优雅地处理特定异常(可能由包装对象抛出)。对于一个异常来通过这个级联直到到达正确的调用处理程序/代理,在每个InvocationHandler中,我会捕获InvocationTargetException,解包它,检查包装的异常是否是instanceof由此处理的异常InvocationHandler。如果它不是instanceof,我会抛弃未解开的异常......对吗?
-
我总是抛出未解开的异常。
这将打印特定方法中的确切代码行,在调用时会引发异常:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| try {
// try code
..
m. invoke(testObject );
..
} catch (InvocationTargetException e ) {
// Answer:
e. getCause(). printStackTrace();
} catch (Exception e ) {
// generic exception handling
e. printStackTrace();
} |
-
谢谢;这有助于我意识到我的问题不是在反射本身,而是在被调用的方法中。
InvocationTargetException可能正在包装你的ArrayIndexOutOfBoundsException。在使用反射时,没有预先知道该方法可以抛出什么 - 所以不是使用throws Exception方法,所有异常都被捕获并包含在InvocationTargetException中。
-
谢谢,但是我如何区别(AssertionError e)和(例外e)?如果我在解开原因之前总是首先获得InvocationTargetException,那么每个异常之间我会有什么不同?
这描述了类似的东西,
InvocationTargetException is a checked exception that wraps an
exception thrown by an invoked method or constructor. As of release
1.4, this exception has been retrofitted to conform to the general purpose exception-chaining mechanism. The"target exception" that is
provided at construction time and accessed via the
getTargetException() method is now known as the cause, and may be
accessed via the Throwable.getCause() method, as well as the
aforementioned"legacy method."
我在class中的try / catch块内的外部class中调用记录器对象的语句中出现java.lang.reflect.InvocationTargetException错误。
逐步调试Eclipse调试器中的代码并将鼠标悬停在logger语句上,我看到logger object是null(一些外部常量需要在class的最顶层实例化)。
您可以使用getCause()方法与原始异常类进行比较,如下所示:
1 2 3 4 5 6 7 8 9
| try{
...
} catch(Exception e ){
if(e. getCause(). getClass(). equals(AssertionError. class)){
// handle your exception 1
} else {
// handle the rest of the world exception
}
} |
我遇到了同样的问题。我使用了e.getCause()。getCause()然后我发现它是因为我传递的错误参数。在获取其中一个参数的值时存在nullPointerException。
希望这会帮助你。
如果底层方法(使用Reflection调用的方法)抛出异常,则抛出此异常。
因此,如果由反射API调用的方法抛出异常(例如运行时异常),则反射API会将异常包装到InvocationTargetException中。
列出Eclipse Navigator模式中的所有jar文件
验证所有jar文件是否处于二进制模式
-
通过在导航器中查看jar文件,您究竟如何验证它们是否处于二进制模式?
-
@William你让我笑哈哈哈。这家伙的回答应该被低估了。
我做错后,错误就消失了
清理 - >运行xDoclet->运行xPackaging。
在我的工作区中,在ecllipse中。