3 回答
TA貢獻1828條經驗 獲得超3個贊
問題是String.valueOf方法已重載:
String.valueOf(Object)
String.valueOf(char[])
Java規范語言要求在這種情況下,選擇最具體的重載:
JLS 15.12.2.5選擇最具體的方法
如果多個成員方法既可訪問又可應用于方法調用,則必須選擇一個成員方法來為運行時方法分派提供描述符。Java編程語言使用選擇最具體方法的規則。
一個char[] 是- Object但不是全部Object 是-一個 char[]。因此,char[]它比特定于Object,并且按照Java語言的規定,String.valueOf(char[])在這種情況下選擇重載。
String.valueOf(char[])期望數組為非數組null,并且由于null在這種情況下給出了數組,因此它拋出NullPointerException。
簡單的“修復”方法是將null顯式轉換Object為如下所示:
System.out.println(String.valueOf((Object) null));
// prints "null"
相關問題
多態多義性如何區分?
Java中將為空選擇哪個重載?
故事的道德啟示
有幾個重要的方面:
有效的Java 2nd Edition,項目41:明智地使用重載
僅僅因為您可以超載,并不意味著您每次都應該
它們可能引起混亂(尤其是如果方法做的事情截然不同的話)
使用良好的IDE,您可以檢查在編譯時選擇了哪個重載
使用Eclipse,您可以將鼠標懸停在上面的表達式上,并看到確實valueOf(char[])選擇了重載!
有時您想顯式投射null(以下示例)
也可以看看
多態性vs覆蓋vs重載
方法重載。你可以過度使用它嗎?
鑄造時 null
至少有兩種情況需要顯式轉換null為特定引用類型:
選擇重載(如上例所示)
為了給null作為單個參數的可變參數參數
后者的一個簡單示例如下:
static void vararg(Object... os) {
System.out.println(os.length);
}
然后,我們可以得到以下內容:
vararg(null, null, null); // prints "3"
vararg(null, null); // prints "2"
vararg(null); // throws NullPointerException!
vararg((Object) null); // prints "1"
TA貢獻1799條經驗 獲得超9個贊
問題是您在打電話String.valueOf(char[])而不是 String.valueOf(Object)。
這樣做的原因是Java將始終選擇與提供的參數一起使用的最特定版本的重載方法。null是Object參數的有效值,但也是char[]參數的有效值。
要使Java使用該Object版本,請null通過變量傳入或指定對Object的顯式強制轉換:
Object o = null;
System.out.println("String.valueOf(null) = " + String.valueOf(o));
// or
System.out.println("String.valueOf(null) = " + String.valueOf((Object) null));
添加回答
舉報
