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

好吧,我已经试图了解和阅读可能导致这种情况的原因,但我就是无法理解。

我的代码里有这个地方。

 try{
 ..
 m.invoke(testObject);
 ..
 } catch(AssertionError e){
 ...
 } catch(Exception e){
 ..
 }

问题是,当它试图调用某些方法时,会抛出 抛出 "InvocationTargetException "而不是其他预期的异常(特别是 "ArrayIndexOutOfBoundsException")。 因为我实际上知道调用的是什么方法,所以我直接进入这个方法的代码,并为假定抛出ArrayIndexOutOfBoundsException'的那一行添加了一个try-catch块,结果它真的如预期那样抛出了ArrayIndexOutOfBoundsException'。然而,当往上走时,它 不知为何变成了InvocationTargetException,在上面的代码中catch(Exception e),e是InvocationTargetException。 e是InvocationTargetException而不是ArrayIndexOutOfBoundsException。 正如预期的那样。

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

解决办法

你用反射调用方法,增加了一个额外的抽象层次。反射层将任何异常包裹在 "InvocationTargetException "中,这可以让你区分由反射调用失败(例如,可能你的参数列表无效)引起的异常和被调用方法中的失败。

只要在 "InvocationTargetException "中解开原因,你就能找到原来的原因。

评论(14)

异常被抛出,如果

InvocationTargetException - 如果底层方法抛出了一个异常。

因此,如果被反射API调用的方法抛出了一个异常(例如运行时异常),反射API将把这个异常包装成一个`InvocationTargetException'。

评论(1)

在 "InvocationTargetException "上使用 "getCause() "方法来检索原始异常。

评论(0)

来自Method.invoke()的Javadoc

抛出。InvocationTargetException - 如果底层方法抛出一个异常。

如果被调用的方法抛出了一个异常,就会抛出这个异常。

评论(2)

那个InvocationTargetException可能是在封装你的ArrayIndexOutOfBoundsException。 在使用反射的时候,前期是无法知道那个方法能抛出什么的--所以与其使用throws Exception的方法,不如用InvocationTargetException来捕获和封装所有的异常。

评论(1)

这将打印出特定方法中的准确代码行,当调用该方法时,会引发异常。

try {

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

} catch (InvocationTargetException e) {

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

    // generic exception handling
    e.printStackTrace();
}
评论(1)

[这][1]描述的是:

&gt.InvocationTargetException InvocationTargetException是一个包裹了一个 &gt.是一个被调用的方法或构造函数引发的异常。 由一个被调用的方法或构造函数引发的异常。 从发布 1.4,这一例外情况已改为符合一般用途的例外连锁机制。 1.4,这个例外已经被改造成符合通用例外链机制。 的"目标异常&quot。 即

在施工时提供,并通过 &gt.getTargetException()方法。 getTargetException()方法现在知道了原因,可能是

通过Throwable.getCause()方法访问,以及通过

前面提到的"传统方法.&quot。

[1]: http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/InvocationTargetException.html

评论(0)

你可以用getCause()方法与原来的异常Class进行比较,像这样。

try{
  ...
} catch(Exception e){
   if(e.getCause().getClass().equals(AssertionError.class)){
      // handle your exception  1
   } else {
      // handle the rest of the world exception 
   }
} 
评论(0)

我在我的 "类 "中的 "try"/"catch "块中调用外部 "类 "中的记录器对象的语句出现了一个 "java.lang.reflect.InvocationTargetException "错误。

在Eclipse调试器中步入代码& 将鼠标悬停在logger语句上,我看到loggerobjectnull(一些外部常量需要在我的class的顶部实例化)。

评论(0)

如果底层方法(使用反射调用的方法)抛出一个异常,那么这个异常就会被抛出,所以如果被反射API调用的方法抛出一个异常(比如运行时异常),反射API会把这个异常封装成一个InvocationTargetException。

因此,如果被反射API调用的方法抛出一个异常(例如运行时异常),反射API将把这个异常包装成一个InvocationTargetException。

评论(0)

我也遇到了同样的问题,我用了e.getCause().getCause(),然后我发现是因为我传错了参数。 我使用e.getCause().getCause(),然后我发现是由于我传递的参数错误。 在获取其中一个参数的值时出现了nullPointerException。 希望能帮到你。

评论(0)
  1. 从Eclipse Navigator模式中列出所有的jar文件
  2. 确认所有的jar文件都是二进制模式。

评论(2)

在我做了 Clean->运行xDoclet->运行xPackaging。

在我的工作区,在ecllipse中。

评论(0)