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

嗯,我试着去理解和解读导致它的原因,但我就是不明白:

在我的代码中有这样的代码:

 try{
..
m.invoke(testObject);
..
} catch(AssertionError e){
...
} catch(Exception e){
..
}
事情是,当它试图调用一些方法时,它抛出 InvocationTargetException而不是其他一些预期异常(特别是ArrayIndexOutOfBoundsException)。 因为我实际上知道调用了什么方法,所以我直接进入这个方法代码,并为假定抛出ArrayIndexOutOfBoundsException的行添加了一个try-catch块,它确实像预期的那样抛出了ArrayIndexOutOfBoundsException。但是当你爬上去的时候 以某种方式更改为InvocationTargetException,并在catch(Exception e)上面的代码中 e是InvocationTargetException而不是ArrayIndexOutOfBoundsException 如预期。< / p >

是什么导致了这样的行为或者我如何检查这样的事情?

1252874 次浏览

来自Method.invoke()的Javadoc

如果底层方法抛出异常,则抛出:InvocationTargetException。

如果调用的方法抛出异常,则抛出此异常。

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

只要在InvocationTargetException中展开原因,你就会得到原始的原因。

则抛出异常

InvocationTargetException—如果底层方法抛出异常。

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

InvocationTargetException可能是你的ArrayIndexOutOfBoundsException的包装。在使用反射时,没有预先告诉该方法可以抛出什么——所以不是使用throws Exception方法,而是捕获所有异常并将其包装在InvocationTargetException中。

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

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

描述如下:

InvocationTargetException是一个检查异常,它包装了一个对象 由被调用的方法或构造函数引发的异常。截至发布 1.4,此异常已进行了改进,以符合通用异常链接机制。即“目标异常” 在施工时提供,并通过 getTargetException()方法现在被认为是原因,并且可能是 可以通过Throwable.getCause()方法访问 前面提到的“遗留方法”。< / p >

如果底层方法(使用Reflection调用的方法)抛出异常,则抛出此异常。

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

这将打印特定方法中的精确代码行,当调用该方法时,会引发异常:

try {


// try code
..
m.invoke(testObject);
..


} catch (InvocationTargetException e) {


// Answer:
e.getCause().printStackTrace();
} catch (Exception e) {


// generic exception handling
e.printStackTrace();
}

在我这样做之后错误消失了 Clean->执行xDoclet->执行xPackaging命令

在我的工作空间,在月蚀中。

您可以使用getCause()方法与原始异常类进行比较,如下所示:

try{
...
} catch(Exception e){
if(e.getCause().getClass().equals(AssertionError.class)){
// handle your exception  1
} else {
// handle the rest of the world exception
}
}
我也面临着同样的问题。我使用e.getCause(). getcause(),然后我发现这是因为我传递了错误的参数。在获取其中一个参数的值时出现nullPointerException。

.

.

在我的classtry / catch块中的外部class中调用记录器对象的语句产生了java.lang.reflect.InvocationTargetException错误。

在Eclipse调试器中逐步执行代码&将鼠标悬停在记录器语句上,我看到记录器objectnull(一些外部常数需要在class的最顶部实例化)。

问题还可能是targetSdkVersion升级了,并且您使用了已弃用的Gradle清单特性。尝试再次降低targetSdkVersion,看看它是否有效。在我的例子中,它是targetSdkVersion 31 ->30.

调用目标异常:

我坚信任何命名惯例都是经过认真思考的 在里面。而且,很有可能我们的问题都有他们的问题

.

.

.

.
让我们把这个名字分成3部分。 “异常"当“;调用"一个“目标"方法。 并且,当在Java中通过< >强反射< / >强调用方法时,此包装器会抛出异常。在执行该方法时,可能会引发任何类型的异常。通过设计,将异常的实际原因抽象出来,以让最终用户知道该异常是在基于反射的方法访问期间发生的。为了获得实际原因,建议捕获异常并调用ex.getCause()。实际上,最佳实践是从捕捉InvocationTargetException

的catch块中抛出原因
try{
method.invoke();
} catch(InvocationTargetException ite) {
throw ite.getCause();
} catch(Exception e) {
// handle non-reflection originated exceptions
throw e;
}


我知道这与其他答案相似,但我想更清楚地说明“何时”;这种异常类型是由Java生成的,因此它对任何人来说都是神秘的。