簡體   English   中英

java null指針異常與靜態數組

[英]java null pointer exception with static array

從靜態成員方法訪問靜態數組時,出現空指針異常。 當我從線程調用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;

}

語句private static regularDataElement[] data = new regularDataElement[nrOfDataElements]; 使用nrOfDataElements大小的數組初始化data 初始化此數組中的每個元素。 即,所有元素均為空。

如果要初始化元素,則應自己進行初始化。 例如,您可以添加一個靜態塊來處理此問題:

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

您是否曾經初始化過data數組?

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

將創建一個數組,其中包含大小為nrOfDataElementsnull對象。 它實際上不會初始化數組中的任何元素。

您似乎沒有為data[i]分配內存,這就是為什么要使用NPE的原因。

僅為陣列分配內存是不夠的。 您需要為每個元素分配內存:

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

(用實際參數替換...

您實際上從未創建任何對象。 您必須在某處添加:

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

當您使用Java初始化Object數組(如代碼中的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM