2010-02-15 137 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