Integer.valueof(null)报错
生活随笔
收集整理的這篇文章主要介紹了
Integer.valueof(null)报错
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文??http://javacat360.iteye.com/blog/2024378 主題?Java 昨天,一同事問我一個問題,估計是他前段日子面試遇到的?
問題很簡單,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"); }
問題很簡單,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"); }
轉載于:https://www.cnblogs.com/zl1991/p/5356450.html
總結
以上是生活随笔為你收集整理的Integer.valueof(null)报错的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM-字节码指令
- 下一篇: 结对编程 黄金点游戏