String.valueof(null)的意外
在整理其他类型转String类型的时候一般来说有两种方法,+""或者是String.valueof(),官方推荐使用String.valueof(),自己对String.valueof进行测试的时候无意中发现String.valueof(null)带来的异常问题,如下
第一种:
Object o = null;
String s = String.valueof(o);
程序会正常执行
第二种:
String s = String.valueof(null);
程序会报空指针异常
后来看源码发现这两种情况下调用的是不同的函数,这里涉及到java的重载,函数名称相同但是参数不同,如下:
String valueof(Object obj)
String valueof(char data[])
String valueof(int i)
String valueof(double d)
...
第一种情况下调用的函数是:
而第二种调用的函数是:
当value为null时候,自然value.length会报出空指针异常
为什么两者会调用不同函数,我们首先需要了解一些基本概念,一般我们知道Java分为两种数据类型,一种是基本数据类型,有八个分别是 byte short int long float double char boolean,一种是引用类型,包括类,接口,数组等等。而Java中还有一种特殊的 null 类型,该类型没有名字,所以不可能声明为 null 类型的变量或者转换为 null 类型,null 引用是 null 类型表达式唯一可能的值,null 引用也可以转换为任意引用类型。我们不需要对 null 类型有多深刻的了解,我们只需要知道 null 是可以成为任意引用类型的特殊符号。
当参数为null的时候,只有String valueof(Object obj)和String valueof(char data[])可以选择(其他重载函数不能编译通过),相比于String valueof(Object obj)来说,String valueof(char data[])更加精确,具有更高的优先级,这也是参数为null的时候调用String valueof(char data[])的根本原因;