19

我想调用一个方法,使用 Java 反射。

问题是这个方法(我写的)抛出了一个异常(我创建了一个myCustomException)。当我添加 try/catch 子句时,我无法运行我的项目,因为 Eclipse 说“catch 子句无法访问”。

这是我尝试在MyClass类中调用myMethod时:

270.    myMethod.invoke(null, myParam); // NB : null because myMethod is static

myMethod不抛出MyCustomException时,一切都很好。但是当它抛出MyCustomException时,我收到以下错误消息:

假设我尝试调用类 BarClass( )中的fooMethod(),并且:

java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.tests.MyClass.test5(270)
    at com.tests.MyClass.main(297)
Caused by: com.tests.MyCustomException
    at com.tests.barClass.fooMethod(BarClass.java:129)
    ... 6 more

甚至可能吗?无论如何感谢您的帮助。

4

3 回答 3

30

您可以得到它的原因,这将是原始异常。

InvocationTargetException.getCause();

从文档:

InvocationTargetException 是一个已检查的异常,它包装了由调用的方法或构造函数抛出的异常。

http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/InvocationTargetException.html

在您的 catch 块中,您可以检查异常是否来自您期望的类型并处理它。

一种简单的方法是:

try {
   ...
} catch (InvocationTargetException ite) {
   if (ite.getCause() instanceof SomeExceptionType) {
      ...
   } else {
      ...
   }
}
于 2012-07-12T12:39:39.780 回答
9

一种方法:

try { myMethod.invoke(null, myParam); }
catch (InvocationTargetException e) { 
  try { throw e.getCause(); }
  catch (MyCustomException e) { ...}
  catch (MyOtherException e) { ...}
}
于 2012-07-12T12:47:56.057 回答
1

如果您试图catch在执行的方法中添加一个子句myMethod.invoke(null, myParam),那么这显然不是正确的做法。在这种情况下,您通过反射调用该方法,这不是捕获异常的地方,因为该invoke方法会引发其他异常。一旦调用了引发异常的方法,如果我没记错的话,如果有异常,它将被抛出并包裹在一个InvocationTargetException中。

检查此解释的最后一部分关于InvocationTargetException.

于 2012-07-12T12:44:18.097 回答