让我们考虑以下代码:
public static void main(String[] args) {
Integer i = null;
Object o = null;
System.out.println(i);
System.out.println(o);
System.out.println(i.toString());
System.out.println(o.toString());
}
很明显,最后两次打印会导致NullPointerException
。无法在null对象上调用方法。
问题是为什么前两个印刷品有效?他们不是也在呼叫toString()
吗?
答案 0 :(得分:4)
不,他们不是。
System.out
是PrintStream
,它会在参数上调用String.valueOf(x)
(如Javadoc中所述)。
答案 1 :(得分:2)
不,他们不是。
System.out.println
(*)。
的内容
println(x == null ? "null" : x.toString());
(*)参数通过String#valueOf
来处理这个问题。
答案 2 :(得分:1)
查看print(String s)
的实现:
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
如果对象恰好是null
,它只会写"null"
。取自java.io.PrintStream:GrepCode