1

ここにこの小さなコードがあります。これは常に NPE をスローします。

public class Test1 {
    private final static Object OBJECT = new Object() {{
        System.out.println("OBJECT.toString() = " + OBJECT.toString());
    }};
    public static void main(String[] args) { }
}

インスタンス初期化ブロックで初期化OBJECT できる方法はありますか? または、インスタンスの初期化ブロックで可能なすべての参照はOBJECT常に NPE をスローしますか?

西側で最速の銃を持っている人は、これを読んでください:いいえ、バグを解決するように求めているわけではありません。これは私がどこかで見た単純化されたコードであり、驚いたことに、Eclipse または Netbeans のいずれでも null 警告を出していません。

4

1 に答える 1

2

二重ブレースの初期化は、インスタンス初期化子を持つ匿名の内部クラスです。したがって、オブジェクトの作成を管理する規則が適用されます。

NPE はランタイム例外であるため、IDE は、静的型付け、宣言された例外、および静的コード分析によって提供される厳密さと確実性ではなく、ヒューリスティックを使用して犯人を見つけます。ここでは、ランタイムの問題を見つけるためにコードを実行する必要があります。

起こっていることはこれです:静的メンバーは、匿名の内部クラスを割り当てることによって初期化されています。これがインスタンス初期化子のルールであるため、内部クラスのコンストラクターは終了しました。ただし、参照はイニシャライザが終了した後にのみ割り当てられ、逆参照を試みるまでには割り当てられませんOBJECT

非常に循環的な説明のように思えますが、それは循環参照が行われているためです ;)

于 2014-08-20T09:58:12.393 に答える