【问题标题】:Catch specific exception in java reflection [duplicate]在java反射中捕获特定异常[重复]
【发布时间】:2019-03-31 13:53:10
【问题描述】:

给定一个具有静态方法的类并抛出一些异常

class Foo {
    public static void doThis() throws CannotDoThisException {
        //do something
    }
}

我正在使用以下反射来调用 doThis 方法

public class Bar {
    Class c = Class.forName("Foo");
    Method m = c.getDeclaredMethod("doThis",null);
    try {
        m.invoke(null,null);
    } catch (CannotDoThisException e) {
       //Compiler says this is unreachable block.
    }
}

如何捕获异常CannotDoThisException?

【问题讨论】:

标签: java reflection


【解决方案1】:

您无法捕获该异常的原因是Method::invoke (javadoc) 不会抛出它!

如果您通过invoke 调用的方法抛出任何 异常,反射层会捕获它,然后创建并抛出InvocationTargetException (javadoc),原始异常为异常的cause

所以这就是你需要做的:

public class Bar {
    Class c = Class.forName("Foo");
    Method m = c.getDeclaredMethod("doThis",null);
    try {
        m.invoke(null,null);
    } catch (InvocationTargetException e) {
       if (e.getCause() instanceof CannotDoThisException) {
           // do something about it
       } else {
           // do something else
           // if the `cause` exception is unchecked you could rethrow it.
       }
    }
}

【讨论】:

  • 非常感谢您的快速回答!我搜索但找不到它。在不知道 InvocationTargetException 的关键字的情况下,很难找到重复项。还要感谢 Dave 指出了重复项。
猜你喜欢
  • 1970-01-01
  • 2022-01-06
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多