Integer.valueof(null)報錯


昨天,一同事問我一個問題,估計是他前段日子面試遇到的 
問題很簡單,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"); }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM