从静态成员方法访问静态数组时,我得到了一个空指针异常。 当我从线程调用setData(x,y,z)时抛出异常。当我调试它时,我发现当我尝试写入数据时,数据[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;
}
答案 0 :(得分:3)
语句private static regularDataElement[] data = new regularDataElement[nrOfDataElements];
使用大小为data
的数组初始化nrOfDataElements
。它不初始化此数组中的每个元素。即,所有元素都为空。
如果您希望初始化元素,则应自行完成。例如,你可以添加一个静态块来处理这个问题:
static regularDataElement[] data = new regularDataElement[nrOfDataElements];
static {
for (int i = 0; i < nrOfDataElements; ++i) {
data[i] = new regularDataElement();
}
}
答案 1 :(得分:2)
你有没有初始化data
阵列?
private static regularDataElement[] data =
new regularDataElement[nrOfDataElements];
将创建一个包含大小为null
的{{1}}个对象的数组。它实际上不会初始化数组中的任何元素。
答案 2 :(得分:1)
您似乎没有为data[i]
分配内存,这就是您获得NPE的原因。
为阵列本身分配内存是不够的。您需要为每个元素分配内存:
for (int i = 0; i < nrOfDataElements; ++i) {
data[i] = new regularDataElement(...);
}
(将...
替换为实际参数。)
答案 3 :(得分:1)
您永远不会创建任何对象。你必须添加一些地方:
for (int i = 0; i < data.length; i++) {
data[i] = new regularDataElement();
}
答案 4 :(得分:1)
在Object
中初始化Java
数组时,如代码中的data
,默认情况下所有元素都设置为null
。
因此,您需要首先填充data
数组,然后才能针对其元素调用任何方法。
假设regularDataElement
类有一个no-args(即没有参数)构造函数,你可以这样做
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
。