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

时间:2011-05-16 16:57:05

标签: java exception reflection invoke

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

我的代码中有这个地方:

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

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

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

13 个答案:

答案 0 :(得分:301)

通过使用反射调用方法,您已经添加了额外的抽象级别。反射层包装InvocationTargetException中的任何异常,这使您可以区分由反射调用失败导致的异常实际(可能您的参数列表无效,示例)和方法中的失败称为。

只需打开InvocationTargetException内的原因,您就可以获得原始版本。

答案 1 :(得分:42)

如果

,则抛出异常
  

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

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

答案 2 :(得分:42)

使用getCause()上的InvocationTargetException方法检索原始例外。

答案 3 :(得分:20)

来自Method.invoke()的Javadoc

  

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

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

答案 4 :(得分:9)

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

答案 5 :(得分:9)

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

try {

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

} catch (InvocationTargetException e) {

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

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

答案 6 :(得分:3)

This描述了类似的内容,

  

InvocationTargetException是一个包装了一个的已检查异常   被调用的方法或构造函数抛出的异常。截至发布   1.4,此异常已经过改进,以符合通用异常链机制。那是“目标异常”   在施工时提供并通过   getTargetException()方法现在称为原因,可能是   通过Throwable.getCause()方法访问,以及   上述“传统方法”。

答案 7 :(得分:1)

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

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

答案 8 :(得分:1)

我的java.lang.reflect.InvocationTargetException中的class / try块内的外部catch中的一个记录器对象调用了一个class错误。 / p>

逐步完成Eclipse调试器和代码中的代码。将鼠标悬停在记录器语句上我看到记录器objectnull(需要在class的最顶部实例化一些外部常量)。

答案 9 :(得分:0)

如果底层方法(使用Reflection调用的方法)抛出异常,则抛出此异常。

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

答案 10 :(得分:0)

我遇到了同样的问题。我使用了e.getCause()。getCause()然后我发现它是因为我传递的错误参数。在获取其中一个参数的值时存在nullPointerException。 希望这会对你有所帮助。

答案 11 :(得分:-2)

  1. 列出Eclipse Navigator模式下的所有jar文件
  2. 验证所有jar文件是否处于二进制模式

答案 12 :(得分:-7)

我做错后消失了 清洁 - >运行xDoclet->运行xPackaging。

在我的工作区中,在ecllipse。