什么可能导致java.lang.reflect.InvocationTargetException?

use*_*413 299 java reflection exception invoke

好吧,我试图理解和阅读可能导致它的原因,但我无法得到它:

我在我的代码中有这个地方:

 try{
 ..
 m.invoke(testObject);
 ..
 } catch(AssertionError e){
 ...
 } catch(Exception e){
 ..
 }
Run Code Online (Sandbox Code Playgroud)

事实是,当它试图调用某个方法时,它会抛出 InvocationTargetException而不是其他预期的异常(具体而言ArrayIndexOutOfBoundsException).因为我实际上知道调用了什么方法,所以我直接使用了这个方法代码,并为假设要抛出的行添加了一个try-catch块 ArrayIndexOutOfBoundsException,它确实ArrayIndexOutOfBoundsException按预期抛出.然而,当它上升时它以某种方式改变,InvocationTargetException并且在上面的代码中,catch(Exception e) e InvocationTargetException并不ArrayIndexOutOfBoundsException 像预期的那样.

什么可能导致这样的行为或我如何检查这样的事情?

Jon*_*eet 321

您通过使用反射调用方法添加了额外的抽象级别.反射层包装了一个异常InvocationTargetException,它允许您区分实际由反射调用中的失败引起的异常(例如,您的参数列表无效)和被调用方法中的失败.

只需打开原因InvocationTargetException,你就会得到原来的原因.

  • 对于任何想知道"在InvocationTargetException`中展开原因意味着什么"的人,我发现如果你用`exception.printStackTrace()`打印它,你只需看看"引起的:"部分而不是上半部分/正常部分. (149认同)
  • 要添加关于"展开"的说明,您还可以捕获异常并对其使用getCause()方法,如果需要,也可以重新抛出该方法.类似于`try {...} catch(InvocationTargetException ex){log.error("oops!",ex.getCause())}`或`... catch ... {throw ex.getCause()} (30认同)
  • @ user550413:当然,通过展开异常并检查它.你总是可以自己扔它,如果你必须的话,就这样抓住它. (4认同)
  • +1 @HJanrs为`你只看"引起的:"部分而不是上半部/正常部分` (4认同)

And*_*s_D 49

如果是,则抛出异常

InvocationTargetException - 如果基础方法抛出异常.

因此,如果使用反射API调用的方法抛出异常(例如运行时异常),则反射API会将异常包装到InvocationTargetException.


小智 43

使用该getCause()方法InvocationTargetException检索原始异常.


Pet*_*rey 21

来自Method.invoke()的Javadoc

抛出:InvocationTargetException - 如果基础方法抛出异常.

如果调用的方法引发异常,则抛出此异常.


Liv*_*Liv 9

InvocationTargetException可能是你的结果ArrayIndexOutOfBoundsException.在使用反射时,没有预先知道该方法可以抛出什么 - 因此,不是使用throws Exception方法,所有异常都被捕获并包含在内InvocationTargetException.


Roc*_*nde 9

这将打印特定方法中的确切代码行,在调用时会引发异常:

try {

    // try code
    ..
    m.invoke(testObject);
    ..

} catch (InvocationTargetException e) {

    // Answer:
    e.getCause().printStackTrace();
} catch (Exception e) {

    // generic exception handling
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)