可能重复:
How to handle a static final field initializer that throws checked exception
在此示例中,我收到错误空白的最终字段myClass可能不已初始化:
private final static MyClass myClass; // <-- error
static {
try {
myClass = new MyClass(); // <-- throws exception
myClass.init();
} catch (Exception e) {
// log
}
}
在该示例中,我收到错误 myClass可能已经的最终字段:
private final static MyClass myClass;
static {
try {
myClass = new MyClass(); // <-- throws exception
myClass.init();
} catch (Exception e) {
myClass = null; // <-- error
// log
}
}
有没有解决这个问题的方法?
答案 0 :(得分:14)
private final static MyClass myClass;
static {
MyClass my;
try {
my = new MyClass();
my.init();
} catch (Exception e) {
my = null;
// log
}
myClass = my; //only one assignment!
}
答案 1 :(得分:10)
这是一个解决方案:
private final static MyClass myClass = buildInstance();
private static MyClass buildInstance() {
try {
MyClass myClass = new MyClass();
myClass.init();
return myClass;
} catch (Exception e) {
return null;
}
}
答案 2 :(得分:3)
如果您的课程是最终的,则初始化后无法更改值。
您在第二个代码段中执行的操作是,您首先将其分配给new MyClass()
,然后如果init()
中出现异常,则将其更改为null
。
这是不允许的。如果new MyClass()
没有抛出异常,为什么不把它放在顶线呢?
但是警告,如果init()
抛出异常,您仍然会有MyClass
的非实体化实例。您使用此类的方式似乎与其设计的工作方式不相符。