在Java中,如果我寫:
System.out.println((String) null);
,我得到"null"
。爲什麼Java將空引用轉換爲String「null」?
這似乎很奇怪。有誰知道爲什麼設計師選擇這種方法?在我看來,這是一個「無中生有」的案例。我讀過JLS entry on cast operators,和它說:
類型強制轉換表達式的是將捕獲轉換(§5.1.10),以他的名字在括號中出現的類型的結果。
即使操作數表達式的結果是一個變量,轉換表達式的結果也不是一個變量,而是一個值。
跳到entry on capture conversion,我看到一般類型定義捕獲轉化率,但是該條目添加:
捕獲轉換比上一個參數化類型之外的任何類型(§4.5)充當標識轉換(§5.1.1)。
好吧!關於entry on identity conversion,這裏有:
對於任何類型都允許從類型到同一類型的轉換。
在這種情況下,該類型是String
,但要轉換的事情是null
並給我留下困惑。但事實證明,Java實際上是使用字符串轉換爲(String) null
。該JLS entry on String conversion說:
任何類型都可以轉換由字符串轉換String類型...
,這引起了
如果引用爲null,它被轉換爲字符串「NULL」(1-4個ASII碼N,U,二)。
的一個問題是這樣的:
HashMap map = new HashMap();
System.out.println((String)map.get("something"));
該程序打印"null"
。我如何知道是否因爲入口是null
而HashMap中的String值爲「null」(四個ASCII字符'n','u','l','l')?現在我知道有人會說Java不鼓勵使用raw types,並且類型HashMap
應該參數化,但解決方案是什麼?
你期望它做什麼? –
可能拋出'NullPointerException' – Nayuki
每個人都使用'System.out.println'來嘗試調試;如果用於調試的主要工具本身會引發異常,它將不會很好地運行。這是一個務實的選擇,使實際的事情不那麼令人驚訝,而不是完全合乎邏輯的事情。 –