2016-12-20 9 views
-2

私はこの減少したコードでなぜnullpointerを取得するのか理解しようとしています。他のユーザーがArrayListを初期化しなかったのと同様の質問があります。私の例では、ArrayListを初期化していますが、追加しようとするとnullpointerが表示されます。何故ですか? 、と私はわからないんだけど、なぜ私のグリッドオブジェクトのISN以降」;Javaで初期化されたArrayList nullpointer

public class Grid { 

    private int x, y; 

    private List<Node>[][] grid = null; 

    public Grid(int x, int y) { 

     this.x = x; 
     this.y = y; 

     this.grid = new ArrayList[x][y]; 
    } 

    public void addEle(Entity entity) { 

     for (int x = 0; x <= 3; x++) { 

      for (int y = 0; y <= 3; y++) { 
       this.grid[x][y].add(new Node(entity)); 
      } 
     } 
    } 
} 

は、私が "this.grid [X] [Y] .add(新しいノード(エンティティ))"、行にnullポインタを取得しますtヌル。

これはとてもここに私の問題の減少した例であるが、私の短命コードの残りの部分である:

Entity.java

public class Entity { 
    public Entity() { } 
} 

Node.java

public class Node { 

    Entity e; 

    public Node(Entity e) { 
     this.e = e; 
    } 
} 

そして最後に私のメインクラス:

Driver.java

投稿で10
public class Driver { 

    public static void main(String[] args) { 

     Grid g = new Grid(4, 4); 
     Entity e = new Entity(); 

     g.addEle(e); 
    } 
} 
+2

'this.grid = new ArrayList [x] [y];'は、** 'null' **' ArrayList'(s)でいっぱいの2次元配列を作成します。 –

+0

@Elliott Frisch、Oh wow、それはばかげたミスです。しかし、私はサイズがゼロから始まると予想していたでしょう。これに関して論理的な方法があるのですか、別のデータ構造を使用する必要がありますか?私はその特定の配列に多くの要素を追加することを計画していますので、nullを処理するために反復処理を行うことは効率が悪いと感じています。 – DontKnockNow

+0

私は実際に何かのようにしようとしています。List [] [] grid = new ArrayList [x] [y];しかし、Javaは試してみると逆転しています。 – DontKnockNow

答えて

2

変数gridList(S)の二次元アレイであり、参照型のデフォルト値はnullあります。したがって、保存するのに十分なスペースを作成します。x x yList(s);あなたの配列に格納するためにListを作成しないでください。あなたのコンストラクタにList(s)の配列を埋めることができます。何かのように、

public Grid(int x, int y) { 
    this.x = x; 
    this.y = y; 

    this.grid = new ArrayList[x][y]; 
    for (int i = 0; i < x; i++) { 
     for (int j = 0; j < y; j++) { 
      this.grid[i][j] = new ArrayList<>(); 
     } 
    } 
} 

私はまたaddEleだけ4要素と機能するようにハードコードされるように表示され、あなたがxyフィールドをシャドウすることを指摘しなければならないと思います。私はあなたが望んだと思う、

public void addEle(Entity entity) { 
    for (int i = 0; i < x; i++) { 
     for (int j = 0; j < y; j++) { 
      this.grid[i][j].add(new Node(entity)); 
     } 
    } 
} 
+0

ありがとう、これは私が探していたものです。私は明確化を感謝し、私のコードに論理を適用する! 2番目のポインタもありがとう - 私はちょうど最小限の例を得るために急いでいたので、私はNPEについて尋ねることができます:) – DontKnockNow

関連する問題