2012-08-01 120 views
4

我正在使用反射来创建对象。根据正在构建的实际对象,构造函数可能会针对特定的自定义异常提供一个throws声明,而且它的重要性我可以理解。Java - 从反射式构造函数中捕捉异常

不幸的是,当我试图将异常添加到包括反射结构try块的渔获量,代码将无法编译,因为:

“无法到达catch块这个异常是永远不会从抛尝试 声明正文“

我意识到,捕捉基类异常会工作,事实上,这对我的代码是好的。但是,情况可能并非总是如此,因为其他不同的例外情况可能适用于未来的其他对象,并且在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){} 
+0

我不认为反射可能会推断出某个方法在编译时可能抛出什么异常 - 事实上,由于这个原因,反射API会抛出它自己的异常。我甚至不确定在运行时确定这一点的方法:P – MadProgrammer 2012-08-01 03:38:59

+1

很高兴看到一些代码 – akf 2012-08-01 03:39:30

+4

您只能捕获InvocationTargetException – 2012-08-01 03:40:18

回答

11

将抛出的异常包装在InvocationTargetException中。抓住并看看原因。

+0

我现在正在生产系统中使用这种方法。 +1 – Synesso 2012-08-01 04:12:40

2

有没有办法表示这个异常可能被抛出,以便我可以明确地捕获它?

因为在该点,由构造函数抛出的任何异常都会被抓起来的InvocationTargetException将被扔在它的位置。这是由javadoc简洁地解释如下:

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

(请注意,它说:“异常”,所以适用于通过构造函数抛出的托运和unchecked异常。)

所以,事实上,编译器被告知在编译错误的真相。你试图捕获的检查异常不可能在这一点上传播。事实上,JLS可达性规则指出,代码肯定无法访问......因此编译错误。