在println中,此处的o.toString()抛出NPE,而o1则不.为什么?
public class RefTest {
public static void main(String[] args) {
Object o = null;
Object o1 = null;
System.out.println(o.toString()); //throws NPE
System.out.print(o1); // does not throw NPE
}
}
最新回答
- 2021-1-111 #
- 2021-1-112 #
null
System.out.println(o.toString())
正在尝试取消引用空对象以将其转换为字符串,然后再将其传递给o.toString()
println
维兹威兹 被称为是
System.out.print(o1);
变体,它本身是在继续操作之前检查对象是否为null。 - 2021-1-113 #
这是因为
print
使用print(Object)
进行转换(除:转换后print(Object)
会表现得像String.valueOf(Object)
被称为println(Object)
有效地使用print(String)
).print(Object)
不像write(int)
那样扔NPE 并定义为返回String.valueOf(Object)
为空参数。o.toString()
这可能有助于向您显示字节码.看看下面的
javap
您班级的输出:仅查看主要方法,就可以看到感兴趣的行在
Code
是8和33。代码8显示了您致电
o.toString()
的字节码 .在这里o
是null
因此在null
上进行任何方法调用的尝试 导致了代码18显示您的
NullPointerException
对象作为参数传递给null
方法.查看此方法的源代码将向您展示为什么not不会在NPE中产生结果:和
public void print(Object obj) { write(String.valueOf(obj)); }
将用String.valueOf()
做到这一点 s:所以您可以看到那里有一个与
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }
相关的测试 ,并防止NPE。