繁体   English   中英

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

[英]Java - Catching an exception from a reflectively called constructor

我正在使用反射创建一个对象。 根据构造的实际对象,构造函数可能具有特定自定义异常的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可达性规则规定,该代码绝对无法访问......因此编译错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM