什么会导致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(异常e)
e是
InvocationTargetException
而不是
ArrayIndexOutOfBoundsException
正如所料


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

来自方法.invoke()的Javadoc

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


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

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


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

如果

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


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

InvocationTargetException
可能正在包装您的
ArrayIndexOutOfBoundsException
。在使用反射时,无法预先知道该方法可以抛出什么——因此,与其使用
抛出异常
方法,不如捕获所有异常并将其包装在
调用TargetException中

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

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

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


    如果基础方法(使用反射调用的方法)引发异常,则会引发此异常


    因此,如果反射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
    (一些外部常量需要在我的
    类的最顶端实例化)。

    谢谢,但是我会在(断言错误e)和(异常e)之间有什么区别?如果我总是在解开原因之前先得到InvocationTargetException,那么每个异常之间的差异在哪里?@user550413:当然,通过解开异常并检查它。如果你想知道“在
    InvocationTargetException
    中打开原因”意味着什么,我刚刚发现,如果你使用
    exception.printStackTrace()
    打印它,你只需查看“原因”:要添加关于“展开”的解释,还可以捕获异常并对其使用getCause()方法,如果需要,还可以重新调用该方法。类似于
    尝试{…}catch(InvocationTargetException ex){log.error(“oops!”,ex.getCause())}
    …catch。。。{throw ex.getCause()}
    +1@HJanrs for
    您只需查看“原因:”部分,而不是上半部分/正常部分
    @DheraajBhaskar不要像编辑自己的答案一样编辑其他人的答案,也不要对未引用的文本使用引号格式。该编辑应该作为评论发布。您如何通过在导航器中查看jar文件来验证它们是否处于二进制模式?@William you让我发笑哈哈哈。这家伙的答案应该被否决。所以假设我有一个
    java.lang.reflect.Proxy
    instanc的级联