什么会导致java.lang.reflect.InvocationTargetException?
好吧,我试着去理解和阅读是什么导致了它,但我就是不明白: 我的代码中有以下内容:什么会导致java.lang.reflect.InvocationTargetException?,java,exception,reflection,invoke,Java,Exception,Reflection,Invoke,好吧,我试着去理解和阅读是什么导致了它,但我就是不明白: 我的代码中有以下内容: try{ .. m.invoke(testObject); .. } catch(AssertionError e){ ... } catch(Exception e){ .. } 问题是,当它试图调用某个方法时,它抛出 InvocationTargetException而不是其他一些预期的异常(特别是ArrayIndexOutOfBoundsException)。 因为我知道调用了什么方法,所
try{
..
m.invoke(testObject);
..
} catch(AssertionError e){
...
} catch(Exception e){
..
}
问题是,当它试图调用某个方法时,它抛出
InvocationTargetException
而不是其他一些预期的异常(特别是ArrayIndexOutOfBoundsException
)。
因为我知道调用了什么方法,所以我直接转到这个方法代码,并为假设抛出ArrayIndexOutOfBoundsException
的行添加了一个try-catch块,它真的像预期的那样抛出了ArrayIndexOutOfBoundsException
。然而当它上升的时候
以某种方式更改为InvocationTargetException
和上面的代码catch(异常e)
e是InvocationTargetException
而不是ArrayIndexOutOfBoundsException
正如所料
什么会导致这样的行为,或者如何检查这样的事情?来自方法.invoke()的Javadoc 抛出:InvocationTargetException-如果基础方法抛出异常
如果调用的方法引发异常,则会引发此异常。通过使用反射调用该方法,您添加了额外的抽象级别。反射层将任何异常封装在
InvocationTargetException
中,这使您能够区分反射调用中的故障(例如,您的参数列表可能无效)实际导致的异常与调用的方法中的故障之间的区别
只要在
InvocationTargetException
中打开原因,就可以找到原始原因。如果
InvocationTargetException-如果基础方法引发异常
因此,如果使用反射API调用的方法抛出异常(例如运行时异常),反射API会将异常包装为
InvocationTargetException
,InvocationTargetException
可能正在包装您的ArrayIndexOutOfBoundsException
。在使用反射时,无法预先知道该方法可以抛出什么——因此,与其使用抛出异常
方法,不如捕获所有异常并将其包装在调用TargetException中
使用getCause()InvocationTargetException
上的方法检索原始异常
列出Eclipse Navigator模式下的所有jar文件
验证所有jar文件都处于二进制模式
描述了这样的事情
InvocationTargetException是包装
被调用的方法或构造函数引发的异常。释放时
1.4,已对该异常进行改装,以符合通用异常链接机制。“目标异常”即
在施工时提供,并通过
getTargetException()方法现在称为原因,可能是
通过Throwable.getCause()方法以及
前面提到的“遗留方法”
如果基础方法(使用反射调用的方法)引发异常,则会引发此异常
因此,如果反射API调用的方法抛出异常(例如运行时异常),反射API将异常包装为InvocationTargetException。这将打印特定方法中的确切代码行,该方法在调用时引发异常:
try {
// try code
..
m.invoke(testObject);
..
} catch (InvocationTargetException e) {
// Answer:
e.getCause().printStackTrace();
} catch (Exception e) {
// generic exception handling
e.printStackTrace();
}
我这样做之后,错误消失了
清理->运行xDoclet->运行XPacking
在我的工作区中,在ecllipse中。可以使用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。
希望这能对您有所帮助。我的类中的try
/catch
块中调用外部类中的logger对象的语句中出现了java.lang.reflect.InvocationTargetException
错误
通过Eclipse调试器中的代码并将鼠标悬停在logger语句上,我看到logger对象是null
(一些外部常量需要在我的类的最顶端实例化)。谢谢,但是我会在(断言错误e)和(异常e)之间有什么区别?如果我总是在解开原因之前先得到InvocationTargetException,那么每个异常之间的差异在哪里?@user550413:当然,通过解开异常并检查它。如果你想知道“在InvocationTargetException
中打开原因”意味着什么,我刚刚发现,如果你使用exception.printStackTrace()
打印它,你只需查看“原因”:要添加关于“展开”的解释,还可以捕获异常并对其使用getCause()方法,如果需要,还可以重新调用该方法。类似于尝试{…}catch(InvocationTargetException ex){log.error(“oops!”,ex.getCause())}
或…catch。。。{throw ex.getCause()}
+1@HJanrs for您只需查看“原因:”部分,而不是上半部分/正常部分
@DheraajBhaskar不要像编辑自己的答案一样编辑其他人的答案,也不要对未引用的文本使用引号格式。该编辑应该作为评论发布。您如何通过在导航器中查看jar文件来验证它们是否处于二进制模式?@William you让我发笑哈哈哈。这家伙的答案应该被否决。所以假设我有一个java.lang.reflect.Proxy
instanc的级联