2011-07-05 10 views
7

今日私たちのコードでこのバグに出くわしました。面白かったので分かち合いました。静的についてのJavaの質問

public class Test { 

    static 
    { 
     text = "Hello"; 
    } 

    public static String getTest() { 
     return text + " World"; 
    } 

    private static String text = null; 
} 

は何Test.getTest();戻り&理由を推測:ここでは、問題の単純化されたバージョンはありますか?

+3

ドキュメントは静的な初期化は、それがソースコードに表示される順序で起こることを述べて、あなたが一番下まであなたの静的なブロックを移動した場合、それは「Hello Worldの」を返します「ヌルWorld」を返すこと"null World"を期待どおりに印刷します。コード内に正確にどのようなバグがあると思いますか? – Perception

+0

これはバグではありません。 – RMT

+2

http://ideone.com/7SV0w –

答えて

18

"null world"と表示されます。静的な初期化は、リストされた順序で行われます。宣言を静的ブロックよりも上に移動する場合は、 "Hello World"を取得する必要があります。

+1

何が起こるか。 – Jacob

+0

+1良い答え! – RMT

+2

'ランタイムシステムは、静的初期化ブロックがソースコード内に現れる順序で呼び出されることを保証します。" http://download.oracle.com/javase/tutorial/java/javaOO/initial.html – Jacob

0

text変数が最初に「Hello」であり、2回目がnullになるため、変数が2回初期化されるため、null Worldを返します。 static initの前にtext変数宣言を移動すると、Hello Worldが得られます。

0

答えは「nullワールド」である必要があります。

0

Javaイニシャライザは、ソースコードと同じ順序で実行するように定義されているため、初期化ブロックはテキストにnullを割り当てる前に実行されます。

このようなバグに対するpro tip:静的変数を最後にするか、静的変数をまったく使用しないでください。

関連する問題