2009-12-17 171 views
25

我一直在試圖創建一個包含兩個值的類的數組,但是當我嘗試應用一個值到數組時,我得到一個NullPointerException。NullPointerException當創建一個對象數組

public class ResultList { 
    public String name; 
    public Object value; 

    public ResultList() {} 
} 

public class Test { 
    public static void main(String[] args){ 
     ResultList[] boll = new ResultList[5]; 
     boll[0].name = "iiii"; 
    } 
} 

爲什麼我得到這個錯誤,我該如何解決它?

+0

將ResultList重命名爲NameValuePair可能會更清楚一些。 – 2009-12-17 15:59:55

+0

你知道一個綁定鍵/值的類已經存在嗎?例如Map 的實現。 – enguerran 2009-12-17 16:18:34

+3

來自C++的常見問題,新數組是一個引用數組,但實際的對象不會被創建。你必須將它們作爲一個單獨的步驟來創建。 Java不允許像C++那樣的對象數組。 – 2009-12-17 21:27:12

回答

35

您創建了該數組,但沒有放入任何內容,因此您有一個包含5個元素的數組,其中全部爲空。您可以添加

boll[0] = new ResultList(); 

在您設置boll [0] .name的行之前。

+4

隨着您的實例化,您將擁有一個包含以下元素的5元素數組:{null,null,null,null,null}。 – enguerran 2009-12-17 15:53:04

1

我想通過調用

ResultList[] boll = new ResultList[5]; 

創建可容納5 ResultList名單,我認爲你有你的設定值[0]之前初始化鈴。

boll[0] = new ResultList(); 
4
ResultList[] boll = new ResultList[5]; 

創建尺寸= 5的陣列,但不創建數組元素。

你必須實例化每個元素。

for(int i=0; i< boll.length;i++) 
    boll[i] = new ResultList(); 
2

正如許多人在以前的解答,所述,ResultList[] boll = new ResultList[5];簡單地創建具有大小5,其中的所有元素都爲空的ResultList的陣列。當您使用boll[0].name時,您嘗試執行類似null.name的操作,這是NullPointerException的原因。使用下面的代碼:

public class Test { 
    public static void main(String[] args){ 
     ResultList[] boll = new ResultList[5]; 

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

     boll[0].name = "iiii"; 
    } 
} 

這裏的for循環基本初始化與ResultList對象數組中的每個元素,一旦for循環完成後,您可以使用

boll[0].name = "iiii"; 
0

此外,還可以

public class ResultList { 
    public String name; 
    public Object value; 

    public ResultList() { 
     System.out.println("Creating Class ResultList"); 
    } 
} 

每當創建一個對象,它的構造函數中堪稱一絕(如果沒有常量:通過添加調試行到您的類,如證實這一點默認情況下,會自動創建一個默認的類,與您在課堂上已有的類似)。如果您只有一個構造函數,那麼創建對象的唯一方法就是調用該構造函數。如果行

ResultList[] boll = new ResultList[5]; 

確實創建了5個新對象,您會看到您的調試行出現在控制檯上5次。如果沒有,你知道構造函數沒有被調用。另請注意,上面的行沒有帶有開放和關閉圓括號「()」的參數列表,因此它不是函數調用或構造函數調用。相反,我們只是指這種類型。我們說:「我需要一個ResultList對象數組的空間,最多5個。」在這一行之後,你擁有的只是空的空間,而不是物體。

當您嘗試各種修復程序時,調試行將幫助確認您獲得了您想要的。

0
ResultList p[] = new ResultList[2]; 

通過寫這個你只需爲2個元素的數組分配空間。 你應該這樣做初始化引用變量:

for(int i = 0; i < 2; i++){ 
    p[i] = new ResultList(); 
} 
0

首先,你必須創建ResultList型的5元所有的,但插入值,當你插入名稱和值是錯誤的。您可以使用構造函數來創建數組元素並將其插入到數組元素中。

class ResultList { 
    public String name; 
    public Object value; 
    public ResultList(String name,Object value){ 
     this.name = name; 
     this.value = value; 
     System.out.println(name+" --- "+value); 
    } 
} 
public static void main(String[] args) { 
     ResultList[] boll = new ResultList[5]; 
     boll[0] = new ResultList("myName","myValue"); 
    } 
0
class ResultList { 
    public String name; 
    public Object value; 
    public ResultList() {} 
} 
public class Test { 
    public static void main(String[] args){ 
    ResultList[] boll = new ResultList[5]; 
    boll[0] = new ResultList(); //assign the ResultList objet to that index 
    boll[0].name = "iiii"; 
    System.out.println(boll[0].name); 
    } 
} 

直到你已經創建的ResultSet對象,但各項指標爲空時指向空引用這是你得到空的原因。 因此只需在該索引上分配對象,然後設置該值即可。

-1

要麼你可以嘗試這種情況,或者你可以在ResultList Class中使變量「name」變爲靜態。所以當ResultList [] boll = new ResultList [5];在那個時候執行該類的所有變量將得到分配

public static void main(String[] args){ 
     ResultList[] boll = new ResultList[5]; 
    boll[0] = new ResultList(); 
    boll[0].name = "iiii"; 

    System.out.println(boll[0].name); 
    } 


public class ResultList { 

    public static String name; 
    public Object value; 

    public ResultList() {} 
} 
+0

您可以嘗試上述方案,或者您可以在ResultList Class中將變量「name」設爲靜態。所以當ResultList [] boll = new ResultList [5];在那個時候被執行,所有來自該類的變量將被分配 – 2017-11-22 07:23:14

+0

你能解釋一下你做了什麼來解決這個問題嗎? – Qwertie 2017-11-22 07:39:33

+1

這已經在幾個答案中提出。 – shmosel 2017-11-22 07:40:20