2014-03-31 179 views
0

在最近的一個項目中追查了一些NullPointerException後,我終於找到他們來自哪裏,這讓我感到驚訝。儘管我現在可以準確地描述它們來自哪裏以及如何防止它們,但我仍然對這種行爲如何在沒有來自編譯器或至少IDE的警告的情況下允許發生混淆。爲什麼我們可以一次實例化多個變量?

我瀏覽了一下Stack並做了一些相當廣泛的使用Google,但是找不到任何關於此的文章。爲了切入這個追逐,一些代碼證明了這種奇怪的行爲;

public class Test { 

     String what, why, where = "who knows?"; 

     public static void main(String[] args) {   
      System.out.println("The 'what' String = " +new Test().what); 
     } 
    } 

輸出;

The 'what' String = null 

這說明正確的輸出,如果你申報並單獨實例每個字符串,而是鏈接在一起這樣使它們被實例化null。那麼,問題是爲什麼?如果這是標準行爲,那麼爲什麼編譯器甚至允許我們以這種方式實例化String對象?

+1

'String what,why,where =「誰知道?」 ;' 這是similer到 'String什麼; 爲什麼; String where =「誰知道?」;' –

+0

警告你什麼?你聲明瞭三個變量並初始化一個變量。並不罕見。 –

回答

3

因爲內部也下降到:

String what=null; 
String why = null; 
String where="who knows?"; // declaring 2 strings, only assigning the value to the third one. 
+1

謝謝。過去一年多來,我一直在進行過度廣泛的編程,而且我從來不知道你只是列舉了最後一個。就在你認爲你的基礎知識百分百降低時,就會發生類似的情況。每天學些新東西。 –

+0

我們都在繼續學習:) – TheLostMind

2

String what, why, where = "who knows?";集值只對所述where變量,而其他被設置爲其默認之一,它是null(如果它們是類成員,當然)。

你可以做到以下幾點:(假設你希望他們都具有相同的值):

String what, why, where; 
what = why = where = "who knows?" 

注意,這兩個語句應該是一個方法,構造或(靜態)初始化內。

1

這equalant到下面,只where得到初始化爲給定值"who knows?",其他設置爲默認值null

String what; 
String why; 
String where="who knows?"; 

嘗試

String what, why, where; 
what = why = where = "who knows?"; 
相關問題