昨天,一同事問我一個問題,估計是他前段日子面試遇到的
問題很簡單,String.valueof(null)的返回值
起初我想了想,應該是String類型的字面量null,可后來上機一試才發現原來返回空指針異常
查看String源碼,發現valueof方法被重載多次,其中String.valueof(null)卻意外的進入了valueof(char[] data)方法,如下圖所示
valueof(char[] data)方法直接進入String構造器
查閱了相關資料,發現stackoverflow上也有人提出過
http://stackoverflow.com/questions/4042675/why-string-valueofnull-is-causing-null-pointer-exception
大體意思就是在多個重載方法均能匹配的條件下,優先會選擇精度高的那個,或者說范圍小的那個,那上面的問題就明朗了,char[]是繼承自object的(java中數組也是一種特殊的object),因此優先選擇精度高的char[]
例如:
因此如下代碼將無法通過編譯,因為String同Integer不存在任何關系,他們都繼承自Object,他們的公共父類是object(String和String[]也是一樣的道理),因此無法通過編譯
問題很簡單,String.valueof(null)的返回值
起初我想了想,應該是String類型的字面量null,可后來上機一試才發現原來返回空指針異常
查看String源碼,發現valueof方法被重載多次,其中String.valueof(null)卻意外的進入了valueof(char[] data)方法,如下圖所示

valueof(char[] data)方法直接進入String構造器
public static String valueOf(char data[]) { return new String(data); }
內部會獲取char[]的length,因此返回空指針異常
public String(char value[]) { this.value = Arrays.copyOf(value, value.length); }
為何眾多的valueof重載方法沒有選擇別的,而選擇了valueof(char[] data)呢,為什么不選valueof(object)呢?
查閱了相關資料,發現stackoverflow上也有人提出過
http://stackoverflow.com/questions/4042675/why-string-valueofnull-is-causing-null-pointer-exception
大體意思就是在多個重載方法均能匹配的條件下,優先會選擇精度高的那個,或者說范圍小的那個,那上面的問題就明朗了,char[]是繼承自object的(java中數組也是一種特殊的object),因此優先選擇精度高的char[]
例如:
public static void main(String[] args) { test(null); //此處將返回arraylist,因為list同arraylist存在繼承或實現的上下級關系 } static void test(List list) { System.out.println("list"); } static void test(ArrayList list) { System.out.println("arraylist"); }
又因為構造函數是編譯時期確定的
因此如下代碼將無法通過編譯,因為String同Integer不存在任何關系,他們都繼承自Object,他們的公共父類是object(String和String[]也是一樣的道理),因此無法通過編譯
public static void main(String[] args) { test(null); //本行會編譯報錯 } static void test(String str) { System.out.println("string"); } static void test(Integer num) { //如果修改為int,則編譯通過 System.out.println("integer"); }