9

さて、これはJavaに関する初心者の質問ですが、頭を悩ませているようには見えません。

クラス内に次のコードがあります

private static final String [] LIST_CODE = gerarListCode();
private static final int [][] LIST_INTEGER = new int [][] {
        {947,947}, {110,103}, 
        {947,958}, {110,120}, 
        {947,954}, {103,107}, 
        {947,967}, {110,99,104}};

 private static String [] gerarListCode()
    {
        String [] listCode = new String [LIST_INTEGER.length];

        for (int i=0 ; i<LIST_INTEGER.length ; i++)
        {
           //do some stuff      
        }

        return listaUnicode;
    }

このコードは、次の行のnullpointerexceptionが原因で初期化例外を発生させています

 String [] listCode = new String [LIST_INTEGER.length];

その時点で、変数LIST_INTEGERはnullのようです。

誰かが理由を説明できますか?クラスローダープロセスは線形ですか?つまり、他のすべての変数を完全にロードする前にメソッドを呼び出しますか?

4

2 に答える 2

11

はい、要するに、それは線形です。

「コンパイラが実際に行うことは、すべての静的変数初期化子とすべての静的初期化子ブロックをクラス宣言に表示される順序で結合する単一のクラス初期化ルーチンを内部的に生成することです。この単一の初期化プロシージャは自動的に実行されます。 、クラスが最初にロードされたときに1回だけ。」

一言で言えばJavaから取られました。

http://www.developer.com/java/other/article.php/2238491

変数を定義してから、静的初期化ブロックで正しい順序で初期化する必要があります。または、次のようにステートメントの順序を入れ替えることができます。

private static final int [][] LIST_INTEGER = new int [][] { {947,947}, {110,103}, 
        {947,958}, {110,120}, 
        {947,954}, {103,107}, 
        {947,967}, {110,99,104}};

private static final String [] LIST_CODE = gerarListCode(); 
于 2009-07-15T19:50:44.343 に答える
4

実際、JVMは、静的フィールドに遭遇した順序で静的フィールドを初期化します。

クラスの静的フィールドは、クラスがJVMによって最初に検出されたときに初期化されます。JavaPuzzlersのpuzzle49(JLS 4.12.5を参照)によると、静的フィールドは最初にデフォルト値に設定されます。オブジェクト変数は、に設定されnullintsは0に設定されます。その後、それらの初期化子は出現順に実行されます。

したがって、あなたの例でLIST_CODEは、LIST_INTEGER最初にに設定されていnullます。次に、LIST_CODEを呼び出して初期化しgerarListCode()ます。そのメソッドが実行されるときLIST_INTEGERはまだです。nullその後、LIST_INTEGER例で指定したリテラル値で初期化されます。

于 2009-07-15T19:49:23.253 に答える