好吧,我试图理解并阅读可能导致它的原因,但我却无法理解:
我的代码中有这个地方:
try{
..
m.invoke(testObject);
..
} catch(AssertionError e){
...
} catch(Exception e){
..
}
问题是,当它尝试调用某些方法时会抛出
InvocationTargetException
而不是其他一些预期的异常(特别是ArrayIndexOutOfBoundsException
)。由于我实际上知道调用了哪种方法,因此我直接转到此方法代码,并为该行添加了一个try-catch块,该块假定会抛出
ArrayIndexOutOfBoundsException
,并且确实按预期的方式抛出了ArrayIndexOutOfBoundsException
。然而当它上升时以某种方式更改为
InvocationTargetException
以及catch(Exception e)
上方的代码e是
InvocationTargetException
而不是ArrayIndexOutOfBoundsException
如预期的那样。是什么原因导致这种行为的?我该如何检查?
最佳答案
通过使用反射调用方法,您已经添加了额外的抽象级别。反射层将任何异常包装在InvocationTargetException
中,这可以让您分辨出反射调用失败(例如,您的参数列表无效)实际导致的异常与所调用方法中的失败之间的区别。
只需在InvocationTargetException
中解开原因,就可以找到原始原因。