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

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

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

Thing is that, when it tries to invoke some method it throws InvocationTargetException instead of some other expected exception (specifically ArrayIndexOutOfBoundsException). As I actually know what method is invoked I went straight to this method code and added a try-catch block for the line that suppose to throw ArrayIndexOutOfBoundsException and it really threw ArrayIndexOutOfBoundsException as expected. 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.

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


当前回答

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

其他回答

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

它描述的是,

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

那个InvocationTargetException可能正在封装你的ArrayIndexOutOfBoundsException。在使用反射时,没有预先说明该方法可以抛出什么——因此,与使用抛出异常方法不同,所有异常都被捕获并封装在InvocationTargetException中。

调用目标异常:

我坚信,任何命名惯例都有勤奋的思想投入 在里面。而且,很有可能我们的问题都有他们的问题 答案就在名字里,如果我们试着找出名字背后的原因。

Let's break the name up into 3 parts. "Exception" has occurred when "Invoking" a "Target" method. And, the exception is thrown with this wrapper when, a method is invoked via reflection in Java. While executing the method, there could be any type of exception raised. It is by design, that the actual cause of the exception is abstracted away, to let the end user know that the exception was one that occurred during a reflection based method access. In order to get the actual cause, it is recommended that the exception is caught and ex.getCause() is called. Best practice is to, in fact throw the cause from the catch block that caught the InvocationTargetException

try{
    method.invoke();
} catch(InvocationTargetException ite) {
    throw ite.getCause();
} catch(Exception e) {
    // handle non-reflection originated exceptions
    throw e;
}

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

我也面临着同样的问题。我使用e.getCause(). getcause(),然后我发现这是因为我传递了错误的参数。在获取其中一个参数的值时出现nullPointerException。 希望这对你有所帮助。