Integer.valueof(null)报错
昨天,一同事问我一个问题,估计是他前段日子面试遇到的
问题很简单,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");
}
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了