2012-09-25 125 views
0

我正在做一個程序中存在問題,我無法弄清楚問題所在。我已經做了幾個較小的測試類來試圖找出問題所在,但我沒有得到它。我確信這是關於Arrays如何工作或什麼的一些基本的事情,但我似乎無法記住什麼。所以我在這裏發佈課程,希望你們知道什麼是錯的。謝謝!爲什麼我會得到NullPointerException?

public class Main { 

    public static void main(String[] args) { 
     TestArray t = new TestArray(8); 
     t.set(1, 15); 
     t.print(); 
    } 

} 


public class TestArray { 
    private Word[] a; 

    public TestArray(int i){ 
     a = new Word[i]; 
    } 

    public void set(int pos, long value){ 
     a[pos].set(value); 
    } 

    public void print(){ 
     for(Word w : a){ 
      System.out.println(w); 
     } 
    } 
} 



public class Word { 
    private long value; 

    public Word(long value){ 
     this.value = value; 
    } 

    public void set(long value){ 
     this.value = value; 
    } 

    public String toString(){ 
     return String.valueOf(value); 
    } 
} 

這是當我嘗試做t.set(1,15)的錯誤occours和Eclipse說什麼是錯與線:A [POS] .SET(值);

+1

發佈堆棧跟蹤。你打算怎麼做? – eboix

回答

4

您並未初始化Word[] a變量的實際元素。如果它們在您的TestArray.set方法中爲空,請將它們初始化。

if (a[pos] == null) 
    a[pos] = new Word(value); 
else 
    a[pos].set(value); 

Java中的對象陣列的值被初始化爲null,這是違背基本數組如何被初始化(爲全零或其等價物)。所以當你通過new Word[i]創建數組時,實際上是創建了一個null元素的數組,你必須相應地設置它們。

的設置方法做它確保你沒有創建任何未使用的Word對象。這被稱爲lazy initialization。另一種方式來做到這一點。將它們全部初始化在構造函數中的一些默認值:

public TestArray(int i){ 
    a = new Word[i]; 
    for (int index = 0; index < i; index++) { 
     a[index] = new Word(0); // Or some other default besides 0, like -1 
    } 
} 

每您的評論:

這似乎是最好的方式,但我真的試圖要做:(for-each code)。在問之前,這不起作用。爲什麼?

您的代碼:

public TestArray(int i) { 
    a = new Word[i]; 
    for(Word w:a) { 
     w = new Word(0); 
    } 
} 

不起作用,因爲w並不像a[index]實際引用。在換每個陣列上的循環,你的代碼實際上做這個編譯時:

for (int $i = 0; $i < a.length; $i++) { 
    Word w = a[$i]; 
    w = new Word(0); 
} 

正如你所看到的,你是局部變量,w分配一個值,而不是在a實際元素,所以數組沒有被改變。此言一:不要揭去由$變量,因爲1)$是合法的Java變量名(雖然你不能明確地使用它們)和2)的Java產生這些變量時,它編譯你的代碼(它可以被看作適當的調試器)。

+0

這似乎是最好的方法,但我實際上試圖做: \t public TestArray(int i){ \t \t a = new Word [i]; (Word w:a){ \t \t \t w = new Word(0); \t \t \t \t} \t} 在問這裏之前,這是行不通的。爲什麼? – Alex

+0

我會編輯來解釋爲什麼沒有用。 – Brian

+0

@Alex更新了我的答案 – Brian

3

您分配一個數組,但你不要放置在之前的訪問中元素的數組元素任何東西。

a[pos].set(value); 

試圖訪問[pos]中的任何內容,該內容爲null。

您通過陣列需要循環,每個數組元素分配TestArray的新實例。

+0

Eric是對的,你需要用Word對象初始化每個數組。您可以在設置方法中使用tje構造函數或更好的方法來設置值 – Deian

+0

public TestArray(int i){ \t \t a = new Word [i]; (Word w:a){ \t \t \t w = new Word(0); \t \t \t \t} \t} 不起作用。 – Alex

相關問題