我有最终的会员资料:
public final Foo foo;
在构造函数中,foo
初始化如下:
foo = new Foo();
现在,不幸的是,Foo的构造函数可能抛出异常:
try {
foo = new Foo();
} catch (Exception e) {
e.printStackTrace();
}
但是现在编译器抱怨foo可能没有被初始化,如果Foo的构造函数抛出异常就是这样。但是如果我把foo = null
放在catch括号内,它就会抱怨foo可能已经被初始化了。
Foo是我无法修改的第三方库。
那么,处理这个问题最优雅的方式是什么?
答案 0 :(得分:7)
foo = createFoo();
...
private static Foo createFoo() {
try {
return new Foo();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
如果内部对象的构造函数失败,那么继续构造外部对象是否有意义我没有评论......
答案 1 :(得分:0)
final Foo foo ;
Foo foo_temp = null ;
try {
foo_temp = new Foo();
} catch (Exception e) {
e.printStackTrace();
} finally {
foo = foo_temp ;
}
答案 2 :(得分:0)
也许我不明白,但我没有得到错误。请注意,ConTest的构造函数抛出了Foo引发的异常。这对我来说是最优雅的(回答你的问题。)如果Foo未能初始化,是不是非常错误?
ConTest.java:
public class ConTest {
public final Foo foo;
public ConTest() throws Exception {
foo = new Foo(3);
}
}
Foo.java:
public class Foo {
public Foo(int i) throws Exception {
if (i < 0) throw new Exception("yah");
}
}
这一切都很好。