このリファレンスは、問題をエスケープします

//この参照エスケープ
問題を引き起こして、この参照にアクセスするには、他のスレッド、及びその初期化されていない変数への更なるアクセスは、そのよう//コンストラクタは、この基準の着自体が外向きに、1の前に完了していない
//クラス2.内部外部アクセス初期化されていないクラスのメンバ変数
3 //多重継承は、親クラスのメンバ変数のアクセス初期化されていないサブクラス。
パブリッククラスTestThisEscape { 
    ファイナルINT、
    INT = B. 3; 
    静的TestThisEscape OBJ; 
    公共TestThisEscape(){ 
        = 3。 ; 
        B = 5; 
        // OBJ =新しい新しいTestThisEscape(); //参照の見かけコンストラクタが原因となり、この基準投げ抜け
    } 

    パブリック静的無効メイン(文字列[] args){ 
       スレッドスレッドAスレッド新しい新=(Runnableを新しい新(){ 
            @Override 
            公共ボイドRUN(){ 
                System.out.printlnは( "---------------"); 
                OBJ =新しい新しいTestThisEscape()。
                System.out.println( "============"); 
            } 
        }、 "スレッドA"); 

       スレッド新しい新=(Runnableを新しい新しい(){ThreadBスレッド
            @Override 
            公共ボイドRUN(){ 
                TestThisEscape OBJ1 = OBJ; // OBJ未初期化完了、これはNULLポインタ原因の使用を指す
               //試み{ 
                    するSystem.out.println(obj1.a); 
                //}キャッチ(例外E){ 
                    System.out.printlnは( 。にThread.currentThread()のgetName()+ " 未初期化変数"); 
                //} 
                試み{ 
                    のSystem.out.println(obj1.b); 
                }キャッチ(例外E){
                    System.out.println(にThread.currentThread()のgetName()+ "B变量未初始化"。)。 
                } 
            }
        }、 "threadB")。
       threadA.start(); 
       threadB.start(); 
    } 

}

  

/ ** 
 *この条件をエスケープ:1.内部クラスのコンストラクタを作成します。2.コンストラクタクラスは、アウト解放この内部参照
 * / 
publicクラスTestInnerClassThisEscape { 
    ファイナルINT A、
    INT = B. 3、
    列C、
    静的TestInnerClassThisEscape OBJ; 
    公共TestInnerClassThisEscape(){ 
        新新しいスレッド((Runnableを新しい新){ 
            @オーバーライド
            公共ボイドRUNを(){ 
                System.out.printlnは(TestInnerClassThisEscape.this.a)
                のSystem.out.println(TestInnerClassThisEscape.this.b)
                のSystem.out.println(TestInnerClassThisEscape.this.c); 
            } 
        })。開始(); 
        試み{ 
            のThread.sleep(1000);
        }キャッチ(InterruptedExceptionある電子){ 
            e.printStackTrace(); 
        } 
        A = 3。
        B = 5。

    } 

    パブリック静的無効メイン(文字列[] args){ 
        新しいTestInnerClassThisEscape()。
    } 

} 
publicクラスTestThisPC { 
    パブリック静的無効メイン(文字列[] args){ 
       新しい子()。
    } 
} 
クラス親{ 
    親(){ 
        プリント()。
    } 
    ボイドプリント(){ 
        System.out.printlnは( "------")。
    } 
} 


クラスの子供は、親{延び
    INT A = 5。
    ボイドプリント(){
        System.out.println( "-----------" + A)。
    } 
     子(){
        スーパー(); 
        印刷(); 
    } 
}

  

解決策:
初期設定を呼び出す前に1

おすすめ

転載: www.cnblogs.com/htkj/p/10932649.html