2016-12-20 160 views
-2

我想了解爲什麼我在這個簡化的代碼中得到了一個空指針。有類似的問題,但其他用戶沒有初始化他們的ArrayList。在我的例子中,我正在初始化我的ArrayList,但是當我嘗試添加它時,仍然會得到一個空指針。這是爲什麼?Java - 初始化的ArrayList空指針

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]。新增(新節點(實體));」,我不知道爲什麼,因爲我的網格對象ISN」 t null。

這是我的問題的一個例子降低所以這裏是我短暫的代碼的其餘部分:

Entity.java

public class Entity { 
    public Entity() { } 
} 

Node.java

public class Node { 

    Entity e; 

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

最後一點,我的主類:

Driver.java

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)的二維數組。 –

+0

@Elliott Frisch,哦,哇,這是一個愚蠢的錯誤。不過,我會預料到從零開始的大小。有沒有解決這個問題的邏輯方法,還是我需要使用不同的數據結構?我正在計劃在該特定數組中添加很多元素,所以我覺得迭代它來處理空值將會是低效的。 – DontKnockNow

+0

我實際上正在試圖製作類似列表 [] [] grid = new ArrayList [x] [y];但是,當我嘗試時,Java正在反擊。 – DontKnockNow

回答

2

可變grid在您的文章是List(S)的二維陣列,並且引用類型的默認值是null。因此,您創建足夠的空間來存儲x x yList(s);但是您不創建List(s)以存儲在您的陣列中。你可以在你的構造函數中填入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要素髮揮作用,你的影子和x領域y。我想你想,

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

謝謝,這就是我一直在尋找的。我很感激澄清,並將邏輯應用於我的代碼!感謝第二個指針 - 我只是急於獲得一個最小的例子,所以我可以問NPE :) – DontKnockNow