10

可能重复:
如何处理引发检查异常的静态最终字段初始化程序

在此示例中,我收到错误The blank final field myClass may not have been initialized

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

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

在该示例中,我收到错误The final field myClass may have been assigned

private final static MyClass myClass;

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

有解决这个问题的办法吗?

4

3 回答 3

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!
}
于 2013-01-30T08:45:06.407 回答
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;
    }
}
于 2013-01-30T08:40:46.737 回答
3

如果你的类是最终的,它一旦被初始化就不能改变值。您在第二个片段中所做的是首先将其分配给new MyClass(),然后如果在您身上抛出异常,init()则将其更改为null.

这是不允许的。如果new MyClass()不抛出异常,为什么不把它放在最上面呢?

但是警告,如果init()抛出异常,您仍然会有一个未初始化的MyClass. 您使用此类的方式似乎与其设计的工作方式不匹配。

于 2013-01-30T08:43:37.057 回答