Java-从反射调用的构造函数中捕获异常



我正在使用反射创建一个对象。根据正在构造的实际对象,构造函数可能有一个特定自定义异常的throws声明,我可以捕捉到它的重要性。

不幸的是,当我试图将异常添加到包含反射构造的try块的catch时,代码将不会编译,因为:

"无法访问的catch块。此异常从未从try中抛出报表正文"

我意识到捕获基类Exception是可行的,实际上这对我的代码来说是可以的。然而,情况可能并不总是如此,因为其他不同的异常可能在未来适用于其他对象,并且在catch内部使用instanceof并重新抛出其他所有对象似乎是不雅的。

有没有一种方法可以发出这个异常可能被抛出的信号,这样我就可以具体地捕捉它?

编辑:根据要求编写一些代码。由于以上原因,无法编译。

try{
  Constructor<? extends Thing> constructor = getClassType().getDeclaredConstructor(SomeParameter.class);
  Thing thing = constructor.newInstance(new SomeParameter());
}
catch(FoobarException e){
  //new Thing(SomeParameter p) might throw this
}
catch(ReflectiveOperationException | IllegalArgumentException | SecurityException e){}

异常将被封装在InvocationTargetException中抛出。抓住它,看看原因。

有没有一种方法可以发出这个异常可能被抛出的信号,这样我就可以具体地捕捉它?

没有。

因为在这一点上,构造函数抛出的任何异常都将被捕获,并在其位置上抛出InvocationTargetException。javadoc简洁地解释如下:

"抛出:[…]InvocationTargetException-如果底层构造函数抛出异常。"

(注意,它说的是"异常",所以这适用于构造函数抛出的已检查和未检查的异常。)

所以实际上,编译器在编译错误中说的是实话。您试图捕获的已检查异常不可能在此时传播。事实上,JLS可达性规则规定代码绝对不可达的。。。因此产生编译错误。

最新更新