1

静的メンバー メソッドから静的配列にアクセスすると、null ポインター例外が発生しました。スレッドから setData(x, y, z) を呼び出すと、例外がスローされます。デバッグしたところ、書き込もうとすると data[0] が null であることがわかりました。nullになる方法がわかりません

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];初期化されます。この配列の各要素は初期化されません。つまり、すべての要素が null です。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 に答える