2016-11-18 3 views
0

2次元配列のオブジェクトをインスタンス化する方法に問題があります。私は、私が得ているエラーを再現するために、小さなサンプルの下でデモンストレーションを試みました。Javaで二次元配列を正しくインスタンス化する方法

私はという名前のこのクラスを持っています。基本的に1文字を格納するノードです。このクラスは、というクラス内で、テストの二次元属性として使用されます。配列のサイズを設定し、instantiate()メソッドの内部でインスタンス化するためにユーザー入力を使用しました。次に、マップを設定メソッドを使用して設定しようとしています。

Eclipseのコンソール出力:

Exception in thread "main" java.lang.NullPointerException at Test.populate(Main.java:44) at Main.main(Main.java:77)

マイ入力された:以下

Enter height: 3 Enter width: 3

が、私はこのエラーを再現するために使用していたコードです:

しかし、コンパイラは私に次のエラーメッセージが表示されます

クラスノード:

class Node { 
    private char content; 

    Node(){ 
     this.content = ' '; 
    } 

    Node(Node node){ 
     this.content = node.getContent(); 
    } 

    //Setter 
    public void setContent(char c) { 
     this.content = c; 
    } 

    //Getter 
    public char getContent() { 
     return this.content; 
    } 
} 

クラステスト:

class Test { 
    private Node[][] map; 
    private int height, width; 

    public void instantiate(){ 
     Scanner reader = new Scanner(System.in); 
     System.out.println("Enter height: "); 
     this.height = reader.nextInt(); 
     System.out.println("Enter width: "); 
     this.width = reader.nextInt(); 
     map = new Node[height][width]; 
     reader.close(); 
    } 

    public void populate(){ 
     for(int i=0;i<height;i++) 
      for(int j=0;j<width;j++){ 
       if((i+j) %2 == 0) 
        map[i][j].setContent('a'); 
       else 
        map[i][j].setContent('b'); 
      } 
     /* 
     * a b a b 
     * b a b a ... 
     * a b a b 
     * b a b a 
     * . . . 
     */ 
    } 

    public void print(){ 
     for(int i=0;i<height;i++){ 
      for(int j=0;j<width;j++){ 
       System.out.print(map[i][j].getContent()); 
      } 
     System.out.println(); 
     } 
    } 

    public Node[][] getMap(){ 
     return this.map; 
    } 

} 

主な方法:

public class Main { 

    public static void main(String[] args) { 
     Test testing = new Test(); 
     testing.instantiate(); 
     testing.populate(); 
     testing.print(); 
    } 
} 

コードもここで見ることができます:http://pastebin.com/agFMmB38
私はまだ(C++から来る)は、Javaに慣れていますので、彼らはいくつかを持っています私はまだそれを把握することができなかった違い。

ご協力いただければ幸いです。 ありがとうございました!

答えて

1

map[i][j]は、新しいオブジェクトに設定する必要があり、map[i][j] = new Node('a')のような(あなたがそのように働いたNodeでコンストラクタを持っている場合だけでなく、:それはNode(char a) { this.content = a; }を書かれたことになります)。

map[i][j].setContent('a')は、既存のNodeオブジェクトではないため、実行できません。

+1

これは機能しました。本当にありがとう、私はこれと数時間苦労していて、それは本当に簡単でした。 – leandrocoutom

+0

いつもお世話になります! – ifly6

0

setContent(char c)メソッドを使用する前にNodeオブジェクトを初期化する必要があります。

public void populate() { 
    for(int i=0;i<height;i++) { 
     for(int j=0;j<width;j++) { 
      map[i][j] = new Node(); 
      if((i+j) %2 == 0) 
       map[i][j].setContent('a'); 
      else 
       map[i][j].setContent('b'); 
     } 
    } 
} 

getContent()メソッドを使用して、必要な値を取得します。

public void print() { 
    for(int i=0;i<height;i++) { 
     for(int j=0;j<width;j++) { 
      System.out.print(map[i][j].getContent()); 
     } 
     System.out.println(); 
    } 
} 
関連する問題