valueOf的源码是
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
可是为什么
if(String.valueOf(null).equals("null") ){
System.out.println("ss");
}
报空指针异常?
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
可是为什么
if(String.valueOf(null).equals("null") ){
System.out.println("ss");
}
报空指针异常?
public static void main(String args[]){
Object o = null;
if(String.valueOf(o).equals("null") ){
System.out.println("ss");
}
if(null instanceof Object)
System.out.println("true");
else
System.out.println("false");
}
}
我这么理解的,String valueOf(Object obj),注意它的参数是Object类型,而null不是Object类型,所以报空指针异常
public String(char value[]) {
int size = value.length;//这行
this.offset = 0;
this.count = size;
this.value = Arrays.copyOf(value, size);
}
二楼的说法,总觉得说不过去..理解不了.api这样说的返回:
如果参数为 null,则字符串等于 "null";否则,返回 obj.toString() 的值。
同意,.equals()是比较是否具有相同的引用,既然是null了,根本就没任何引用,肯定报异常
==用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true
原生方法必然空指针
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
return new String(data);
}
|
V
public String(char value[]) {
int size = value.length;
this.offset = 0;
this.count = size;
this.value = Arrays.copyOf(value, size);
}value为空导致异常
查看String.valueOf函数
发现有个N个.排除基本类型为参数的及参数个数不一致的同名函数
只留下2个函数
String.valueOf(Object o)
String.valueOf(char[] data)
显然后者比前者更精确。因此编译器认为String.valueOf(null)调用的是后者.
而后者又调用 new String(char[])
so 空指针了
如果你是对一个变量调用其String.valueOf函数,则编译器取其字面类型。
除了被声明为char[]类型的null外,其它类型的null,其valueOf都返回"null"
int size = value.length;
this.offset = 0;
this.count = size;
this.value = Arrays.copyOf(value, size);
}
这段代码是从哪来的?
null在Java里是一个“神奇”的对象,既不是任何对象,又可以被强转为任何对象Java编译器在处理函数调用时,会使用尽量精确的函数定义
查看String.valueOf函数
发现有个N个.排除基本类型为参数的及参数个数不一致的同名函数
只留下2个函数
String.valueOf(Object o)
String.valueOf(char[] data)
显然后者比前者更精确。因此编译器认为String.valueOf(null)调用的是后者.
而后者又调用 new String(char[])
so 空指针了
equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等。
==用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true