5

我运行了以下代码

String str = null;
System.out.println(str);

输出为null

起初,我以为NullPointerException打印对象隐式调用toString方法会被抛出。所以,我对输出感到惊讶。

然后我考虑了输出,并认为上面的 String 语句实际上没有创建任何对象,只创建了不指向任何对象的引用。所以这可能是这种输出的原因。

有人可以让我知道我的理解是否正确。

4

5 回答 5

8

这些print()方法显式检查.null

public void print(String s) {
    if (s == null) {
        s = "null";
    }
    write(s);
}
于 2012-10-29T18:24:12.597 回答
3

PrintStream.print检查是否是null

 public void print(String s) {
   if (s == null) {
    s = "null";
   }
   write(s);
 }

从 JavadocPrintStream.print检查它是否是null

打印一个字符串。如果参数为空,则打印字符串“null”。否则,字符串的字符会根据平台默认的字符编码转换为字节,并且这些字节完全按照 write(int) 方法的方式写入。

于 2012-10-29T18:24:52.417 回答
2

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"

于 2012-10-29T18:25:23.550 回答
2

Print()默认情况下检查null,但是当你这样做时

System.out.print(str.toString());

现在你会得到NullPointerException

于 2012-10-29T18:25:52.537 回答
1

使用引用打印对象null应该不会给您带来问题。在引用(或指针,如果你愿意的话)上调用操作null应该会给你一个 NPE。尝试做一个

System.out.println (str.toString())

那应该给你一个很好的NPE

于 2012-10-29T18:25:27.990 回答