什么会导致java.lang.reflect.InvocationTargetException?

什么会导致java.lang.reflect.InvocationTargetException?,java,exception,reflection,invoke,Java,Exception,Reflection,Invoke,好吧,我试着去理解和阅读是什么导致了它,但我就是不明白: 我的代码中有以下内容: try{ .. m.invoke(testObject); .. } catch(AssertionError e){ ... } catch(Exception e){ .. } 问题是,当它试图调用某个方法时,它抛出 InvocationTargetException而不是其他一些预期的异常,特别是ArrayIndexOutOfBoundsException。 因为我知道调用了什么方法,所以

好吧,我试着去理解和阅读是什么导致了它,但我就是不明白:

我的代码中有以下内容:

 try{
 ..
 m.invoke(testObject);
 ..
 } catch(AssertionError e){
 ...
 } catch(Exception e){
 ..
 }
问题是,当它试图调用某个方法时,它抛出 InvocationTargetException而不是其他一些预期的异常,特别是ArrayIndexOutOfBoundsException。 因为我知道调用了什么方法,所以我直接转到了这个方法代码,并为假设抛出ArrayIndexOutOfBoundsException的行添加了一个try-catch块,它确实像预期的那样抛出了ArrayIndexOutOfBoundsException。然而当它上升的时候 以某种方式更改了InvocationTargetException和上面的代码catch Exception e是InvocationTargetException,而不是ArrayIndexOutOfBoundsException 正如所料


什么会导致这样的行为,或者如何检查这样的事情?

来自Method.invoke的Javadoc

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


如果调用的方法引发异常,则会引发此异常。

通过使用反射调用该方法,您添加了额外的抽象级别。反射层将任何异常包装在InvocationTargetException中,这使您可以区分反射调用中的故障实际导致的异常(例如,您的参数列表可能无效)和调用的方法中的故障


只要在InvocationTargetException中打开原因,就可以找到原始原因。

如果

InvocationTargetException-如果基础方法引发异常

因此,如果已使用反射API调用的方法抛出异常运行时异常,例如,反射API将异常包装为InvocationTargetException。

该InvocationTargetException可能正在包装ArrayIndexOutOfBoundsException。当使用反射时,无法预先知道该方法可以抛出什么-因此,与使用抛出异常方法不同,所有异常都被捕获并封装在InvocationTargetException中。

使用InvocationTargetException上的getCause方法来检索原始异常

列出Eclipse Navigator模式下的所有jar文件 验证所有jar文件都处于二进制模式 描述了这样的事情

InvocationTargetException是包装 被调用的方法或构造函数引发的异常。释放时 1.4,已对该异常进行改装,以符合通用异常链接机制。目标异常是 在施工时提供,并通过 getTargetException方法现在被称为原因,可能是 通过Throwable.getCause方法以及 前面提到的遗留方法


如果使用反射调用的基础methodmethod引发异常,则会引发此异常


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

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

try {

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

} catch (InvocationTargetException e) {

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

    // generic exception handling
    e.printStackTrace();
}

我这样做之后,错误消失了 清理->运行xDoclet->运行XPacking


在我的工作区中的ecllipse中。

可以使用getCause方法与原始异常类进行比较,如下所示:

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。 希望这能对您有所帮助。

我的类中的try/catch块内的外部类中调用logger对象的语句导致java.lang.reflect.InvocationTargetException错误


在Eclipse调试器中单步执行代码&将鼠标悬停在logger语句上,我看到logger对象为null。需要在类的最顶层实例化一些外部常量。

谢谢,但这将如何区分AssertionError e和Exception e呢?如果我总是在解开原因之前先得到InvocationTargetException,那么每个异常之间的差异在哪里?@user550413:当然,通过解开异常并检查它。您可以自己抛出它,如果必须的话,也可以这样捕获它。对于任何想知道在InvocationTargetException中打开原因意味着什么的人,我刚刚发现,如果您使用exception.printStackTrace打印它,您只需查看引起原因:部分,而不是上半部分/正常部分。要添加关于展开的解释,您还可以捕获异常并对其使用getCause方法,如果需要,还可以重新调用该方法。类似于尝试{…}catch InvocationTargetException ex{log.erroroops!、ex.getCause}或…catch。。。{thr
ow ex.getCause}+1@HJanrs对于您来说,只需查看引起原因:部分,而不是上半部分/正常部分section@DheraajBhaskar不要像编辑自己的答案一样编辑别人的答案,也不要对没有引用的文本使用引用格式。该编辑应该作为评论发布。您如何通过在导航器中查看jar文件来验证它们是否处于二进制模式?@William you让我发笑哈哈哈。这家伙的答案应该被否决,所以想象一下我有一个java.lang.reflect.Proxy实例级联来扩展一个包装对象。每个代理通过使用自己的调用处理程序优雅地处理包装对象可能引发的特定异常。为了让异常在这个级联中波动,直到到达正确的调用处理程序/代理,在每个调用处理程序中,我将捕获InvocationTargetException,将其展开,检查包装的异常是否是要由这个InvocationHandler处理的异常的实例。如果不是instanceof,我会抛出未包装异常。。。对吗?我总是抛出未包装的异常。谢谢;这让我意识到我的问题不在于反射本身,而在于调用的方法。很好的解释!如果我期望底层方法抛出异常怎么办?我是否应该捕获此异常并简单地重试?