方法传入不同类型的null值,调用的重载方法不同,可能导致空指针异常
%E4%BC%A0%E5%85%A5null%E5%80%BC%2FString.valueOf()%20%E9%87%8D%E8%BD%BD.jpg)
测试
%E4%BC%A0%E5%85%A5null%E5%80%BC%2FString.valueOf().jpg)
入参为 字符类型或 类型未定义,当值为NULL的时候,调用valueof(char[] data),报空指针异常
入参为对象类型,当值为NULL的时候,调用valueOf(Object obj),返回一个”null”字符串.
注意
当 入参类型未定义 ,值为NULL时,两个重载方法均能匹配的条件下,优先会选择精度高的那个,char[]和object均能匹配null值,因此valueOf(null)会调用valueof(char[] data)
案例1
public class TestNull {
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");
}
}
案例2
public class TestNull {
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同Integer不存在任何关系,他们都继承自Object,他们的公共父类是object,此时null值不知道该传入那个方法,因此无法通过编译