我运行了以下代码
String str = null;
System.out.println(str);
输出为null。
起初,我以为NullPointerException
打印对象隐式调用toString
方法会被抛出。所以,我对输出感到惊讶。
然后我考虑了输出,并认为上面的 String 语句实际上没有创建任何对象,只创建了不指向任何对象的引用。所以这可能是这种输出的原因。
有人可以让我知道我的理解是否正确。
这些print()
方法显式检查.null
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
PrintStream.print
检查是否是null
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
从 JavadocPrintStream.print
检查它是否是null
:
打印一个字符串。如果参数为空,则打印字符串“null”。否则,字符串的字符会根据平台默认的字符编码转换为字节,并且这些字节完全按照 write(int) 方法的方式写入。
NullPointerException
仅当您使用引用指向null
调用某些方法或访问某些值时才会发生。仅仅打印一个null
值不会导致NullPointerException
.
所以,在下面的代码中,你会得到NPE
: -
String str = null;
System.out.println(str.length());
如果你看到PrintStream#print
方法的源代码,如下图所示:-
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
因此,它会检查null
值并相应地打印"null"
。
Print()
默认情况下检查null
,但是当你这样做时
System.out.print(str.toString());
现在你会得到NullPointerException
使用引用打印对象null
应该不会给您带来问题。在引用(或指针,如果你愿意的话)上调用操作null
应该会给你一个 NPE。尝试做一个
System.out.println (str.toString())
那应该给你一个很好的NPE