5

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

不幸的是,当我尝试将异常添加到包含反射构造的 try 块的捕获中时,代码将无法编译,因为:

“无法到达的 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){}
4

2 回答 2

12

异常将被包裹在一个InvocationTargetException. 抓住它,看看原因。

于 2012-08-01T03:50:58.627 回答
2

有没有办法表明可能会引发此异常,以便我可以专门捕获它?

不。

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

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

(请注意,它说的是“异常”,因此这适用于构造函数抛出的已检查和未检查的异常。)

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

于 2012-08-01T04:04:36.713 回答