2010-02-15 117 views
1

我試圖調整我在網絡上找到的一個類,用於動態數組「Entities」的動態數組,但現在我得到一個「NullPointerException」。Java空指針異常

提高異常的代碼是:

public void initialize() 
{ 
    buffer = new BufferedImage(800,600,BufferedImage.TYPE_INT_RGB); 
    Entities.put(Entities.getCurrentPos()+1, new Entity(100, 100, Color.green)); 
    Entities.put(Entities.getCurrentPos()+1, new Entity(400, 400, Color.blue)); 
} 

DynArrayEntities類的相關部分:

... 

private Entity[] data; // An array to hold the data. 
private int currentpos = 0; 

... 

public void put(int position, Entity value) { 

    if (position >= data.length) { 

     int newSize = 2 * data.length; 
      if (position >= newSize) 
       newSize = 2 * position; 
     Entity[] newData = new Entity[newSize]; 
     System.arraycopy(data, 0, newData, 0, data.length); 
     data = newData; 
    } 

    data[position] = value; 
    currentpos++; 

} 

.... 

public int getCurrentPos() { 
    return currentpos; 
} 

預先感謝您的幫助!

+3

如果Java中出現異常,堆棧跟蹤非常重要。它會詳細告訴您調用歷史記錄,並指出造成此異常的第一行。在不知道調用情況以及代碼中第一行跟蹤點的位置的情況下,很難 - 如果不是不可能的 - 僅基於僅代表SSCCE的剝離代碼提供可靠的答案(http://sscce.org) 。所以,在將來,*請*發佈堆棧跟蹤。或者花些功夫學習如何讀取/解釋堆棧跟蹤。 – BalusC 2010-02-15 23:54:45

+0

看起來像一個初學者的編程作業。大多數人只會使用Java的內置類。 – 2010-02-16 00:17:43

+0

Heh。不知道有這個內置的Java類。 :D 恐怕我會在Google上搜索...... – 2010-02-16 00:59:27

回答

3
... 

private Entity[] data= new Entity[0]; // Or some value > 0 
... 

否則數據在您首次在方法中訪問時爲空。

+0

這樣的實現通常包含一個帶有「容量」參數的構造函數來確定數組的初始大小。請參閱Java的ArrayList類。 – 2010-02-16 00:16:12

+0

是的,它似乎我沒有正確初始化陣列。謝謝! – 2010-02-16 01:09:22

2

你做

position >= data.length 

初始化data

+0

是的,你和Carsten都發現了我的錯誤。謝謝! – 2010-02-16 01:09:56

0

之前(是實體領域?在這種情況下,你應該把它的實體。見http://java.sun.com/docs/codeconv/

你應該確切地告訴大家,上NPE的哪條線被拋出。如果它在initialize()方法的第二行中,那麼實體字段可能爲空。如果它在put()方法中,那麼可能是因爲數據字段爲空。

+0

抱歉,不清楚錯誤。謝謝你的幫助! – 2010-02-16 01:10:38

0

你這樣做只是一個學習練習嗎?如果沒有,爲什麼不使用java.util.Vector,它爲任何Object提供動態數組?

+0

我明白了!我想我會用一個Vector來保存所有的實體。 – 2010-02-16 01:10:18