亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么String.valueOf(null)拋出NullPointerException?

為什么String.valueOf(null)拋出NullPointerException?

米琪卡哇伊 2019-10-25 10:26:09
根據文檔,該方法String.valueOf(Object obj)返回:如果參數是null,則字符串等于"null"; 否則,obj.toString()返回的值。但是,當我嘗試這樣做時,怎么會這樣:System.out.println("String.valueOf(null) = " + String.valueOf(null));它會拋出NPE嗎?(如果您不相信,請自己嘗試?。?nbsp;   線程“主”中的異常java.lang.NullPointerException    在java.lang.String。(未知來源)    在java.lang.String.valueOf(未知來源)怎么會這樣呢?文件在騙我嗎?這是Java中的主要錯誤嗎?
查看完整描述

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"



查看完整回答
反對 回復 2019-10-25
?
揚帆大魚

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));


查看完整回答
反對 回復 2019-10-25
  • 3 回答
  • 0 關注
  • 830 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號