昨天,一同事问我一个问题,估计是他前段日子面试遇到的 
问题很简单,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");
}

Integer.valueof(null)报错的更多相关文章

  1. oracle-function-into时为null报错

    oracle-function-into时为null报错 create or replace function P_ADD_CUSTOMER_FOR_CSS_heyt_test(i_cust_name ...

  2. mybatis学习 -每天一记 mybatis insert null 报错

    mybatis 插入数据,model的属性存在null,插入报错 在使用mybatis 进行insert时,如果字段值存在null的情况,会出现插入失败的情况,解决方案: 如果使用spring boo ...

  3. mysql创建表时,设置timestamp DEFAULT NULL报错1067 - Invalid default value for 'updated_at'

    问题背景: 线上的linux服务器上的mysql服务器中导出数据库的结构.想要在本地创建一个测试版本 导出后再本地mysql上运行却报错   1067 - Invalid default value ...

  4. mysql 修改列为not null报错Invalid use of NULL value

    场景:mysql 给表新增parent_id列,并设置为not null,保存时报错Invalid use of NULL value. 报错原因:因为已存在的数据的parent_id列为null,与 ...

  5. String.valueOf(null) 报空指针

    String.valueOf 默认的方法 argument 可以为null 的 boolean b = null; char c = null; char[] data = null; double ...

  6. Exception occurred during processing request: null报错

    报错, 恶心的一笔. 报错的地方 解决方法: 没注意到...

  7. 控制台Cannot read property 'disabled' of null报错的问题

    点击任何东西控制台都会报错: 也没有提示哪儿出了问题,后来我就代码一块一块的注释,终于找到了原因. 我在项目中用了 el-dropdown ,但是没有用他的el-dropdown-menu 所以才会一 ...

  8. java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"报错

    出现问题的原因: 内存用户验证时,Spring boot 2.0.1引用的security 依赖是 spring security 5.X版本,此版本需要提供一个PasswordEncorder的实例 ...

  9. PHP Lumen Call to a member function connection() on null 报错

    (1/1) Error Call to a member function connection() on nullin Model.php line 1201at Model::resolveCon ...

随机推荐

  1. js 变量与值 连写

    window.location.href="index.php?app=memberpmrecord&act=get_download&bname="+busine ...

  2. Git的常用操作,记录下

    首先生成密钥 ssh-keygen -t rsa -C "your_email@youremail.com" 然后打开workdir,敲 git init 设置一个远端库 git ...

  3. goldengate初始化

    对丢弃已久的goldengate环境重新配置,使其重新开始跑起来 环境是一个主机上的两个库,都是单机,所以也就没配pump进程了,trail file都是在一个文件夹下的,extract写trail ...

  4. EF深入系列--Code First

    首先是创建DbContext,有两种途径 ①手动编写DbContext代码,同时还要记得去配置文件中添加connectionStrings public class BooksContext : Db ...

  5. PHP用mb_string函数库处理与windows相关中文字符

    昨天想批处理以前下载的一堆文件,把文件里的关键内容用正则匹配出来,集中处理.在操作文件时遇到一个问题,就是windows操作系统中的编码问题. 我们都知道windows中(当然是中文版),文件名和文件 ...

  6. Webview加载本地js、图片的方法

    在项目开发中经常会将比较大的js.图片.css等放到app中,而html放服务器,这样在使用时流量较少,加载也比都放服务器上快,其实方法也比较多,网上搜了很久都没结果. 一种是获取服务器返回的html ...

  7. 移动Windows用户文件夹的方法研究

    这种方法可能导致升级Windows失败.请谨慎使用. Windows 8.1 使用有效.其他系统请酌情修改. —————————————————————————— 复制文件内容(带权限等信息):有的说 ...

  8. 几种语言的CGI编程

    为了了解PHP.JSP.ASP出现之前人们写网站的方法,洒家研究了一波CGI,使用C.Python.batch.shell script语言写了几个简单的网页. CGI即通用网关接口,指web服务器调 ...

  9. jquery常用方法

    一.多个按钮绑定同一事件 $("#index_svip,#index_svip_renew").click(function() { seajs.use(['svipLayer'] ...

  10. ARM学习篇 SDRAM理解

    1.SDRAM单管存储单元 SDRAM单管电路图 C记忆单元 T控制门管 Z字线 W位线 注:图示为N沟道耗尽型MOS管 写入:Z加高电平,MOS导通,W状态决定了电容C的状态 读出:Z加高电平,MO ...