10

重複の可能性:
チェック例外をスローする static final フィールド初期化子の処理方法

この例では、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 already have already 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

クラスが final の場合、初期化後に値を変更することはできません。2 番目のスニペットで行っていることは、最初に に割り当ててからnew MyClass()、例外がスローされたinit()場合は に変更することnullです。

これは許可されていません。new MyClass()例外がスローされない場合は、一番上の行に配置してみませんか?

ただし、 がinit()例外をスローした場合でも、初期化されていない のインスタンスが残ることに注意してくださいMyClass。このクラスでの作業方法は、設計された動作方法と一致していないようです。

于 2013-01-30T08:43:37.057 に答える