valueOf和空指针异常问题

bolziman123 2010-06-03 08:32:49
valueOf的源码是
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
可是为什么
if(String.valueOf(null).equals("null") ){
System.out.println("ss");
}
报空指针异常?
...全文
498 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2010-06-04
  • 打赏
  • 举报
回复
JDK的String类源码
bolziman123 2010-06-04
  • 打赏
  • 举报
回复
public String(char value[]) {
int size = value.length;
this.offset = 0;
this.count = size;
this.value = Arrays.copyOf(value, size);
}
这段代码是从哪来的?
xiaoshihenmei 2010-06-04
  • 打赏
  • 举报
回复
null.equals()肯定会报错啊
uqortbsa 2010-06-04
  • 打赏
  • 举报
回复
函数重载的问题!!!!
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
zhuyouyong 2010-06-04
  • 打赏
  • 举报
回复
顶[Quote=引用 1 楼 gesanri 的回复:]
Java code


public class Test{
public static void main(String args[]){
Object o = null;
if(String.valueOf(o).equals("null") ){
System.out.println("ss");
……
[/Quote]
bolziman123 2010-06-04
  • 打赏
  • 举报
回复
我的jdk api 1.60没看到有源码可以看啊?
「已注销」 2010-06-03
  • 打赏
  • 举报
回复
如1楼提到的代码
如果你是对一个变量调用其String.valueOf函数,则编译器取其字面类型。
除了被声明为char[]类型的null外,其它类型的null,其valueOf都返回"null"
「已注销」 2010-06-03
  • 打赏
  • 举报
回复
null在Java里是一个“神奇”的对象,既不是任何对象,又可以被强转为任何对象

Java编译器在处理函数调用时,会使用尽量精确的函数定义
查看String.valueOf函数
发现有个N个.排除基本类型为参数的及参数个数不一致的同名函数
只留下2个函数
String.valueOf(Object o)
String.valueOf(char[] data)
显然后者比前者更精确。因此编译器认为String.valueOf(null)调用的是后者.
而后者又调用 new String(char[])
so 空指针了
dracularking 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 bolziman123 的回复:]

如果没用到那个方法的话,那么valueOf的对参数的处理是怎样的?
[/Quote]
三楼提到过~

public static String valueOf(char data[]) {
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为空导致异常
bolziman123 2010-06-03
  • 打赏
  • 举报
回复
如果没用到那个方法的话,那么valueOf的对参数的处理是怎样的?
dracularking 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bolziman123 的回复:]

原生方法的概念不大清楚
[/Quote]
就是根本没用到你这个方法
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
gjanyanlig 2010-06-03
  • 打赏
  • 举报
回复
这里应该是java.lang.String,此异常貌似和public static String valueOf(Object obj)是静态方法有关,大家怎么看呢?
bolziman123 2010-06-03
  • 打赏
  • 举报
回复
原生方法的概念不大清楚
dracularking 2010-06-03
  • 打赏
  • 举报
回复
你说valueOf的源码,这里用的String.valueOf还是java.lang.String的原生方法吧?
原生方法必然空指针
bolziman123 2010-06-03
  • 打赏
  • 举报
回复
equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等。
==用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true
24K純帥 2010-06-03
  • 打赏
  • 举报
回复
额( ⊙ o ⊙ )!
水中影子 2010-06-03
  • 打赏
  • 举报
回复
顶楼上!
gjanyanlig 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lyqiang00 的回复:]

String.valueOf(null) = null,既然是null,那还能.equals()吗?
[/Quote]

同意,.equals()是比较是否具有相同的引用,既然是null了,根本就没任何引用,肯定报异常
危险的大猫 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lyqiang00 的回复:]
String.valueOf(null) = null,既然是null,那还能.equals()吗?
[/Quote]
源码中很清楚说了,返回String类 "null"
bolziman123 2010-06-03
  • 打赏
  • 举报
回复
和四楼的想法一样,理解不了
加载更多回复(3)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧