1

从静态成员方法访问静态数组时出现空指针异常。当我从线程调用 setData(x, y, z) 时引发异常。当我调试它时,我发现当我尝试写入时 data[0] 为空。我只是不明白它怎么可能是空的

public class dataContainer 
{
    private static final short nrOfDataElements = ids.total_ids;
    private static regularDataElement[] data = new regularDataElement[nrOfDataElements];


    public static synchronized void getData(final short i, regularDataElement r)
    {
        if ( (i >= 0) && (i < nrOfDataElements) )
            r.set(data[i].getTimestamp(), data[i].getValue());  
    }          

    public static synchronized void setData(short i, double ts, long val)
    {
        if ( (i >= 0) && (i < nrOfDataElements) )
            data[i].set(ts, val); //<<-------null pointer exception, debugging showed data[i] == null, (with i = 0 and nrOfDataElements = 12)
    }
}

public class regularDataElement 
{
    regularDataElement()
    {
        set(0, 0);
    }

    public void set(double _ts, long _val)
    {
        System.out.println(this.ts + " " + _ts + " " + this.val + " " + _val); System.out.flush();
        this.ts = _ts;
        this.val = _val;    
    }

    public double getTimestamp()
    {
        return this.ts;
    }

    public long getValue()
    {
        return this.val;
    }

    private double ts;
    private long val;

}
4

5 回答 5

3

该语句使用大小为 的数组进行private static regularDataElement[] data = new regularDataElement[nrOfDataElements];初始化。它不会初始化此数组中的每个元素。即,所有元素都为空。datanrOfDataElements

如果你想初始化元素,你应该自己做。例如,您可以添加一个静态块来处理此问题:

static regularDataElement[] data = new regularDataElement[nrOfDataElements];
static {
    for (int i = 0; i < nrOfDataElements; ++i) {
        data[i] = new regularDataElement();
    }
}
于 2013-11-18T20:43:51.540 回答
2

你有没有初始化data数组?

private static regularDataElement[] data = 
    new regularDataElement[nrOfDataElements];

将创建一个充满null大小对象的数组nrOfDataElements。它实际上不会初始化数组中的任何元素。

于 2013-11-18T20:41:44.173 回答
1

您似乎没有为 分配内存data[i],这就是您获得 NPE 的原因。

为数组本身分配内存是不够的。您需要为每个元素分配内存:

for (int i = 0; i < nrOfDataElements; ++i) {
   data[i] = new regularDataElement(...);
}

(替换...为实际参数。)

于 2013-11-18T20:41:35.877 回答
1

您实际上从未创建任何对象。您必须在某处添加:

for (int i = 0; i < data.length; i++) {
    data[i] = new regularDataElement();
}
于 2013-11-18T20:42:20.760 回答
1

当您在 中初始化Object数组时Java,就像data在您的代码中一样,所有元素默认设置为null.

因此,您需要先填充data数组,然后才能针对其元素调用任何方法。

假设regularDataElement该类有一个无参数(即无参数)构造函数,您可以这样做

static regularDataElement[] data = new regularDataElement[nrOfDataElements];

static
{
    for (int i=0; i<nrOfDataElements; i++)
    {
        data[i] = new regularDataElement();
    }
}

当然,您可以有一个单独的方法来初始化数组,例如

static regularDataElement[] initialize(int nrOfDataElements)
{
    regularDataElement[] elements = new regularDataElement[nrOfDataElements];

    for (int i=0; i<nrOfDataElements; i++)
    {
        elements[i] = new regularDataElement();
    }

    return elements;
}

然后调用该方法来创建和初始化数据数组,替换语句

static regularDataElement[] data = new regularDataElement[nrOfDataElements];

static regularDataElement[] data = initialize(nrOfDataElements);

此外,为了遵循既定的编码约定,您应该以大写字母开头命名您的类,即使用RegularDataElement而不是regularDataElement.

于 2013-11-18T20:42:26.667 回答