2013-04-01 15 views
0
public class Whatever { 
    static double d; 
    static char c; 
    static String[] s; 
    static char[] b; 
    static double[] dd; 
    static Whatever w; 
    static Whatever[] ww; 

    public static void main(String[] args) { 
     System.out.println(Whatever.d); //prints out 0.0 
     System.out.println("hi"+Whatever.c+"hi"); //prints out hi hi 
     System.out.println(s); //prints out null 
     System.out.println(b); //null pointer exception! 
     System.out.println(Whatever.dd); 
     System.out.println(Whatever.w); 
     System.out.println(Whatever.ww); 
    } 
} 

爲什麼我得到一個空指針異常?爲什麼基元數組字段會輸出空指針異常?

請在內存方面解釋,如果你可以,但是我的記憶有基本的瞭解,所以不要在深入太任。

+1

發佈您的真實代碼。你現在擁有的是不可編譯的。 – Perception

+2

你確定這段代碼編譯得很好,因爲x似乎沒有被聲明爲靜態的嗎? – Dinakar

+0

對不起,在聲明數組時,我忘記了包含關鍵字static。 –

回答

1

好了,現在你已經發布完整的代碼,它更容易幫助!這是當你調用PrintStream.println具有基本陣列通常會發生什麼:

String s = String.valueOf(x); 

最終做到這一點:

return (obj == null) ? "null" : obj.toString(); 

正如你所看到的,所提供的對象是空的可能性是明確處理。然而,對於字符數組的PrintStream類特定的過載,只是。以下是邏輯的粗略描述:

write(cbuf, 0, cbuf.length); 

其中cbuf是給定的字符數組。正如你所看到的,它試圖引用字符數組的長度,如果數組未被初始化,它將與NPE一起炸燬。這是實施過程中奇怪而不幸的不一致。

所以現在你明白了爲什麼 NPE正在發生 - 要解決它只是初始化字符數組,然後再試圖打印出來。

+0

謝謝。是的,我剛剛在我的學校帶着一位導師來解答這個問題,並且我們設法爲char數組找到了這個方法。 我們得出這樣的結論:它與該方法有關,但你更深入地解釋它,所以謝謝。 –

0

有一些問題在這裏:

1. You're not allocating any space for `int x` 
2. If you want to print the contents of `x`, it should be `x.toString()` 
3. What did you expect the output to be from your sample code? 

我猜#3是不是你實際上有工作,我建議你顯示你真正的代碼來獲得一個真正的答案:)

希望這可以清除它一點你。

$ cat Whatever.java 
public class Whatever { 
    static final int MAX = 5; 
    int[] x = new int[MAX]; // allocate array to sizeof '5' 

    public Whatever() { 
     // do stuff 
    } 

    public void addStuff() { 
     for(int i=0; i<MAX; i++) 
      x[i] = i + 2; 

    } 

    public void printX() { 
     for(int i=0; i<MAX; i++) 
      System.out.println(i + ": " + x[i]); 

    } 

    public static void main(String[] args){ 
     Whatever w = new Whatever(); // new instance of 'Whatever' 
     w.addStuff();     // add some ints to the array 
     w.printX();     // print out the array 
     // print the Array 'x' 
     System.out.println("Array: " + w.x); 
    } 
} 
$ java Whatever 
0: 2 
1: 3 
2: 4 
3: 5 
4: 6 
Array: [[email protected] 
+0

他沒有試圖打印任何東西的地址。調用默認的'toString()'方法,返回對象的字符串表示形式。見[this](http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#toString()) – MAV

+0

@MAV是的,我的不好。固定的 – chrsblck

0

該問題基本上取決於如何實施PrintStream.println(...)。除char[]外,原始數組被視爲java.lang.Object。所以使用的println過載是println(Object)。在下面,打印對象涉及調用對象的toString()。因此NPE。

如果你想成爲防守空的,你應該考慮使用String.valueOf(Object)

+0

'String.valueOf()'還會爲未初始化的char數組拋出NPE。如果我沒有弄錯它是因爲'valueOf(char [])'調用構造函數'String(char [])',然後嘗試使用數組的長度。 – MAV

+0

你是對的 - 我的回答只是部分完成。它只解釋了非char []'數組的行爲。 –