2014-12-21 38 views
-2

我試圖用數字填充ArrayList<Integer>。當我調用主方法中的方法時,編譯器會抱怨如何從一個方法填充ArrayList <Integer>?

Exception in thread "main"` 

    java.lang.NullPointerException 
     at PrimeSum.setGeneralArray(PrimeSum.java:11) 
     at PrimeSum.main(PrimeSum.java:36) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:483) 
     at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) 

Process finished with exit code 1 

這是我的代碼示例。

public class PrimeSum { 
private ArrayList<Integer> generalArray; 
private int limit; 
public void setGeneralArray() { 
    for(int i = 2; i < 2000001; i++) { 
     generalArray.add(i); 
    } 
} 
// ... 
// This is how I call on the method. 
public static void main(String[] args) { 
    PrimeSum ps = new PrimeSum(); 
    ps.setGeneralArray(); 
    // ... 

我做錯了什麼?

回答

0

當您調用add時,實例字段generalArray仍爲null

您需要在填充它之前對它進行初始化。

無論是在聲明:

private ArrayList<Integer> generalArray = new ArrayList<Integer>(); 

或者在構造函數中:

public PrimeSum() { 
    generalArray = new ArrayList<Integer>(); 
} 

或者在一個實例聲明:

{ 
    generalArray = new ArrayList<Integer>(); 
} 
0

你忘了初始化ArrayList,我的朋友。

private ArrayList<Integer> generalArray = new ArrayList<Integer>(); 

最好的方法是在構造函數中初始化它。

public class PrimeSum { 
private ArrayList<Integer> generalArray; 
private int limit; 
public PrimeSum(){ 
    generalArray = new ArrayList<Integer>(); 
} 
public void setGeneralArray() { 
    for(int i = 2; i < 2000001; i++) { 
     generalArray.add(i); 
    } 
} 
... 
//This is how I call on the method. 
public static void main(String[] args) { 
    PrimeSum ps = new PrimeSum(); 
    ps.setGeneralArray(); 
    ... 
0

初始化,缺少用於陣列:

private ArrayList<Integer> generalArray = new ArrayList<Integer>(); 

沒有這一點,該generalArraynull(因此NullPointerException)。

private ArrayList<Integer> generalArray; 
public PrimeSum(){ 
    generalArray = new ArrayList<Integer>(); 
} 
0

generalArray參考類型,它的初始值是null,那是什麼JLS 4.12.5. Initial Values of Variables狀態:

對於所有引用類型(§4.3),默認值是null

ReferenceType: 
    ClassOrInterfaceType 
    TypeVariable 
    ArrayType 

要初始化它,你應該使用new關鍵字並調用符合您需求的構造。

0

默認情況下,所有的Java對象被初始化null,而你試圖說null.add(number),因此你得到空指針異常。詳情請參閱this。你需要初始化它。你可以在類本身

private ArrayList<Integer> generalArray = new ArrayList<Integer>(); 

做到這一點無論是直接或者你可以在構造函數中,每當你,你在主喜歡PrimeSum ps = new PrimeSum();確實創造型PrimeSum的對象被稱爲初始化。你可以做到這一點,如下:

public PrimeSum() { 
    generalArray = new ArrayList<Integer>(); 
} 
0

在列表 創建整數

ArrayList<Integer> generalArray = new ArrayList<Integer> 

爲附加項目的ArrayList中做到這一點:

generalArray.add(1); 
    generalArray.add(2); 
    generalArray.add(3);