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