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

那么,我试图理解和阅读什么可能会导致它,但我无法得到它:

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

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

事情是,当它试图调用某个方法时,它抛出InvocationTargetException而不是其他一些预期的exception(特别是ArrayIndexOutOfBoundsException )。 因为我真的知道什么方法被调用,我直接去了这个方法的代码,并添加了一个try-catch块的行,假设抛出ArrayIndexOutOfBoundsException ,它真的抛出ArrayIndexOutOfBoundsException预期。 然而,当它上升到某种程度上更改为InvocationTargetException并在上面的代码catch(Exception e) e是InvocationTargetException而不是ArrayIndexOutOfBoundsException如预期。

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

通过调用具有reflection的方法,您已经添加了一个额外的抽象级别。 reflection层将InvocationTargetException任何exception包装在一起,这样可以让您区分由reflection调用中的失败(例如,您的参数列表无效)导致的exception和调用的方法中的失败之间的差异。

只需在InvocationTargetException解开原因,就可以达到原来的目的。

如果抛出exception

InvocationTargetException – 如果基础方法抛出exception。

因此,如果已经使用reflectionAPI调用的方法引发exception(例如,运行时exception),则reflectionAPI将将exception封装到InvocationTargetException

使用InvocationTargetException上的getCause()方法来检索原始exception。

从Method.invoke()的Javadoc

抛出:InvocationTargetException – 如果基础方法抛出exception。

如果调用的方法抛出exception,则会引发此exception。

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

 try { // try code .. m.invoke(testObject); .. } catch (InvocationTargetException e) { // Answer: e.getCause().printStackTrace(); } catch (Exception e) { // generic exception handling e.printStackTrace(); } 

InvocationTargetException可能包装你的ArrayIndexOutOfBoundsException 。 在使用reflection的时候没有提前说明这个方法可以抛出什么 – 所以不是使用throws Exception方法,所有的exception都被捕获并包装在InvocationTargetException

这描述了类似的,

InvocationTargetException是一个检查的exception,它封装了被调用的方法或构造函数抛出的exception。 从版本1.4开始,这个exception已经被改进,以符合通用的exception链接机制。 在构build时提供并通过getTargetException()方法访问的“目标exception”现在被称为原因,可以通过Throwable.getCause()方法以及前面提到的“遗留方法”来访问。

  1. 列出Eclipse Navigator模式下的所有jar文件
  2. 确认所有的jar文件都是二进制模式

如果基础方法(使用Reflection调用的方法)引发exception,则会引发此exception。

因此,如果reflectionAPI调用的方法引发exception(例如运行时exception),则reflectionAPI将将该exception包装到InvocationTargetException中。

您可以使用getCause()方法比较原始exception类,如下所示:

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

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

在执行Clean-> Run xDoclet-> Run xPackaging之后,错误消失了。

在我的工作区,在ecllipse。