今天在排查問題的時候發(fā)現(xiàn)String.valueOf 的一個有意思的問題韭畸,第一種情況:
String.valueOf(null);
第一種情況:
Map<String, Object> map = new HashMap<String, Object>();
String a = String.valueOf(map.get("a"));
乍看上去笛质,肯定會是一樣的結果炼邀,要么都得到"null"字符串,要么都報錯灯抛,但是金赦,結果是這樣的:第一種情況會報空指針異常,第二種情況不會報異常对嚼,只是得到一個null夹抗。
一開始覺得難以置信,無論String.valueOf方法有沒有對參數進行判空纵竖,都一定是相同的:如果進行了判空漠烧,null安全,應該會返回一個null靡砌,如果沒有已脓,那么都會報錯。
網上查找了一些相關資料乏奥,又去看了下String.valueOf的源碼,真相終于水落石出:String.valueOf方法有好幾個重載方法亥曹,但是由于null不可能賦值給基本數據類型邓了,所以只剩下2個備選的方法:String valueOf(char data[]) 和 String valueOf(Object obj)。
String valueOf(char data[]) 源碼:
/**
* Returns the string representation of the {@code char} array
* argument. The contents of the character array are copied; subsequent
* modification of the character array does not affect the returned
* string.
*
* @param data the character array.
* @return a {@code String} that contains the characters of the
* character array.
*/
public static String valueOf(char data[]) {
return new String(data);
}
String valueOf(Object obj) 源碼:
/**
* Returns the string representation of the {@code Object} argument.
*
* @param obj an {@code Object}.
* @return if the argument is {@code null}, then a string equal to
* {@code "null"}; otherwise, the value of
* {@code obj.toString()} is returned.
* @see java.lang.Object#toString()
*/
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
查看代碼可以看到String valueOf(Object obj)進行了判空媳瞪,而String valueOf(char data[])沒有骗炉。所以很明顯,第一種情況調用了String valueOf(char data[])蛇受,所以是報了空指針異常句葵;而第二種情況下,調用了String valueOf(char data[])兢仰,所以沒有報乍丈。
null對于String valueOf(char data[]) 和 String valueOf(Object obj)的參數都是使用的,那么java如何選擇:首先把将,對于第二種情況轻专,很容易理解,由于map指定了泛型察蹲,所以從這個map取出來的肯定是一個Object 類型的參數请垛,肯定會調用String valueOf(Object obj)方法催训。對于第一種情況,java會選取精確度最高的一種重載方法宗收。如果對于某個參數漫拭,String valueOf(char data[])可以適用的話,String valueOf(Object obj)是肯定可以適用的混稽,所以String valueOf(char data[])的精確度就比String valueOf(Obect obj)的精確度要高采驻,null同時適用于這兩個方法,所以java會選取精確度較高的一個來執(zhí)行荚坞。