最终字段可能尚未/已经初始化

sp0*_*00m 10 java final field initialization

可能重复:
如何处理抛出已检查异常的静态最终字段初始值设定项

在这个例子中,我得到了错误的空白最后一个字段myClass的可能被初始化:

private final static MyClass myClass; // <-- error

static {
    try {
        myClass = new MyClass(); // <-- throws exception
        myClass.init();
    } catch (Exception e) {
        // log
    }
}
Run Code Online (Sandbox Code Playgroud)

在那个例子中,我得到错误最终字段myClass可能已经被分配:

private final static MyClass myClass;

static {
    try {
        myClass = new MyClass(); // <-- throws exception
        myClass.init();
    } catch (Exception e) {
        myClass = null; // <-- error
        // log
    }
}
Run Code Online (Sandbox Code Playgroud)

那个问题有什么解决方案吗?

kut*_*kem 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!
}
Run Code Online (Sandbox Code Playgroud)


Den*_*ret 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;
    }
}
Run Code Online (Sandbox Code Playgroud)