什么可能导致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()方法以及前面提到的“遗留方法”来访问。
- 列出Eclipse Navigator模式下的所有jar文件
- 确认所有的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。