2010-10-28 92 views
9

爲什麼String.valueOf(null)導致空指針異常?預期的行爲是返回「空」字符串。爲什麼String.valueOf(null)導致空指針異常?

String x = null; 
    System.out.println(String.valueOf(x)); 

這給出了一個「空」字符串。但是

System.out.println(String.valueOf(null)); 

將導致空指針異常。

回答

18

因爲String.valueOf(null)選擇char[]參數的重載方法,然後在new String(null)構造函數中失敗。這個選擇是在編譯時進行的。

如果你想明確地使用重載的方法有Object的說法,使用:

String.valueOf((Object) null) 

注意,沒有重載方法採取String參數 - 一個在第一種情況下調用正在Object

引述JLS

15.12.2編譯時步驟2:確定方法簽名

第二步搜索在用於部件的方法的一步驟中確定的類型。此步驟使用方法的名稱和參數表達式的類型來定位既可訪問又適用的方法,即可以在給定參數上正確調用的聲明。可能有不止一種這樣的方法,在這種情況下,選擇最具體的方法。最具體方法的描述符(簽名+返回類型)是在運行時用來執行方法調度的方法。

的所有方法都適用,所以我們去:

15.12.2.5選擇最具體方法

如果不止一個成員方法既方便和適用於一個方法調用,有必要選擇一個爲運行時方法調度提供描述符。 Java編程語言使用選擇最具體方法的規則。

非正式的直覺是,如果由第一個方法處理的任何調用可以傳遞到另一個沒有編譯時類型錯誤的方法,那麼其中一個方法比另一個更具體。

由於polygenelubricants - 僅存在兩個重載方法接受一個對象 - char[]Object - char[]是最特定的。

+0

null應該被視爲一個對象。爲什麼它將它視爲char []? – Sujith 2010-10-28 12:14:07

+3

@Sujith:因爲'char []'*是一個對象 – skaffman 2010-10-28 12:18:19

+0

@Sujith你使用的是eclipse還是javac? – Bozho 2010-10-28 12:20:39