如何使用Java反射调用引发异常的方法?

如何使用Java反射调用引发异常的方法?,java,exception,reflection,invoke,Java,Exception,Reflection,Invoke,我想使用Java反射调用一个方法 问题是这个方法(我写的)抛出了一个异常(我创建了一个myCustomException)。当我添加try/catch子句时,我无法运行我的项目,因为Eclipse说“catch子句不可访问” 下面是我尝试在MyClass类中调用myMethod时的示例: 当myMethod不抛出MyCustomException时,一切正常。但当它抛出MyCustomException时,我会收到以下错误消息: 假设我尝试调用类BarClass()中的fooMethod(),并

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

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

下面是我尝试在MyClass类中调用myMethod时的示例:

当myMethod不抛出MyCustomException时,一切正常。但当它抛出MyCustomException时,我会收到以下错误消息:

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


有可能吗?不管怎样,谢谢你的帮助。

你可以找到它的原因,这将是最初的异常

InvocationTargetException.getCause();
从文件:

InvocationTargetException是包装 被调用的方法或构造函数引发的异常

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

一个简单的办法是:

try {
   ...
} catch (InvocationTargetException ite) {
   if (ite.getCause() instanceof SomeExceptionType) {
      ...
   } else {
      ...
   }
}

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

检查关于调用TargetException的
的最后一部分

一种方法:

try { myMethod.invoke(null, myParam); }
catch (InvocationTargetException e) { 
  try { throw e.getCause(); }
  catch (MyCustomException e) { ...}
  catch (MyOtherException e) { ...}
}

方法调用似乎正在引发异常。用try-catch环绕它。谢谢!它起作用了。但是我无法从MyCustomException中获取消息,使用的是
getCause().getMessage()
,即使我创建了MyCustomException,如下所示:
new MyCustomException(“消息”)
。我想这可能是由于您的具体实现,你能调试并检查异常是否真的包含了消息吗?我用Marko Topolnik的方法成功了。无论如何谢谢你。OP,Francisco的方法和我的方法是等效的,应该要么都给你消息,要么都不给,这取决于与我们展示的代码无关的因素。我的方法的唯一优点是不必经历“如果其他”的游行。实际上它也不起作用!当我执行
getMessage()
时,我只会得到
null
,这很奇怪,因为同一个类在其他上下文中完全工作,没有反射。它可以工作。这是我的错,在MyCustomException中,构造函数设置不正确:我没有传递消息!愚蠢的错误
try {
   ...
} catch (InvocationTargetException ite) {
   if (ite.getCause() instanceof SomeExceptionType) {
      ...
   } else {
      ...
   }
}
try { myMethod.invoke(null, myParam); }
catch (InvocationTargetException e) { 
  try { throw e.getCause(); }
  catch (MyCustomException e) { ...}
  catch (MyOtherException e) { ...}
}