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

2022-08-31 04:48:54

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

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

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

问题是,当它尝试调用某个方法时,它会引发而不是其他一些预期的异常(特别是)。由于我实际上知道调用了什么方法,我直接转到了此方法代码,并为假设抛出的行添加了一个 try-catch 块,并且它确实按预期抛出。然而,当上升时,它以某种方式更改为上面的代码e是,而不是预期的。InvocationTargetExceptionArrayIndexOutOfBoundsExceptionArrayIndexOutOfBoundsExceptionArrayIndexOutOfBoundsExceptionInvocationTargetExceptioncatch(Exception e)InvocationTargetExceptionArrayIndexOutOfBoundsException

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


答案 1

您已经通过调用具有反射的方法添加了额外的抽象级别。反射层将任何异常包装在 中,这使您可以分辨出由反射调用中的失败(例如,可能您的参数列表无效)实际导致的异常与调用的方法中的失败之间的区别。InvocationTargetException

只需解开其中的原因,你就会得到原来的原因。InvocationTargetException


答案 2

在以下情况下将引发异常:

InvocationTargetException - 如果基础方法引发异常。

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