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

新手上路,请多包涵

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

我的代码中有这个:

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

事情是,当它试图调用它抛出的某些方法时 InvocationTargetException 而不是其他一些预期的异常(特别是 ArrayIndexOutOfBoundsException )。因为我实际上知道调用了什么方法,所以我直接转到此方法代码并为假设抛出 ArrayIndexOutOfBoundsException 的行添加了一个 try-catch 块,它确实按预期抛出了 ArrayIndexOutOfBoundsException 。 Yet when going up it somehow changes to InvocationTargetException and in the code above catch(Exception e) e is InvocationTargetException and not ArrayIndexOutOfBoundsException as expected.

什么可能导致这种行为或我如何检查这种情况?

原文由 user550413 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

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

只需解开 InvocationTargetException 中的原因,您就会找到原始原因。

原文由 Jon Skeet 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果抛出异常

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

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

原文由 Andreas Dolk 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题