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

时间:2013-01-30 08:38:50

标签: java initialization field final

  

可能重复:
  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
    }
}

有没有解决这个问题的方法?

3 个答案:

答案 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的非实体化实例。您使用此类的方式似乎与其设计的工作方式不相符。