2011-04-24 11 views
0

私は本当に基本的な間違いを犯していると思いますが、1時間ぐらい遊んだ後ではこれを解決できません。 1つのメソッドで配列を作成し、mainメソッドで呼び出そうとしますが、mainメソッドから配列を参照するときにはnullポインタ例外が発生します。私のクラスには、次のとおりです。異なる方法のJava Array

public class test { 

    public static String[][] Data; 

    public static void createArray() { 
      System.out.println("Test 2"); 

      String[][] Data = new String[2][4]; 

      Data[0][0] = "13CG43"; //CD ID 
      Data[0][1] = "POP"; //Type 
      Data[0][2] = "12.99"; //Price 
      Data[0][3] = "5"; //Stock 

      //Second row 
      Data[1][0] = "293DD3"; //CD ID 
      Data[1][1] = "HIP"; //Type 
      Data[1][2] = "14.99"; //Price 
      Data[1][3] = "2"; //Stock 

     } 


    public static void main(String[] args) { 

     try { 
      System.out.println("Test1"); 
      createArray(); 
      System.out.print("Test3 " + Data[0][0]); 

      } catch(Exception e) { 
       System.out.println("Error"); 
      } 


    } 
} 

おかげで、

+1

createArray()では、クラス静的変数 'Data'をオーバーライドするローカル変数 'Data'を定義しますが、ウィザードは決して初期化されません。 クラス変数 'Data'を使用して、createArray()メソッドの再定義「String [] []」を削除します。 –

答えて

4

これは、配列宣言が関数呼び出し内にあるためです。それを外部に置くと、createArray関数が返された後でもデータは利用可能になります。

変更:あなたはcreateArray関数のスコープ内のデータ配列を再宣言された

Data = new String[2][4]; 

String[][] Data = new String[2][4]; 

。そこで、あなたのプログラムに2つのデータ配列がありました。 1つはグローバルで、もう1つはあなたの関数にローカルであり、グローバルなものを隠しています。 createArray関数が返された後に、初期化していた配列であった最新のものが破棄されます。

7
public static void createArray() { 
      System.out.println("Test 2"); 

      Data = new String[2][4]; 

      Data[0][0] = "13CG43"; //CD ID 
      Data[0][1] = "POP"; //Type 
      Data[0][2] = "12.99"; //Price 
      Data[0][3] = "5"; //Stock 

      //Second row 
      Data[1][0] = "293DD3"; //CD ID 
      Data[1][1] = "HIP"; //Type 
      Data[1][2] = "14.99"; //Price 
      Data[1][3] = "2"; //Stock 

     } 

あなたはメソッド内で新しいローカル変数を宣言する代わりに、グローバルな1つを変更されました。

+0

ブリリアント。ありがとう! – Joseph

+0

+1ですが、短い説明文を追加すると完成します – MByD

関連する問題