为什么System.out.println()没有抛出NullPointerException?

时间:2015-01-20 08:16:13

标签: java nullpointerexception

这可能是一个非常基本的问题,但我仍然不知道答案。

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

为什么System.out.println打印" null"并且不会抛出NullPointerException

7 个答案:

答案 0 :(得分:11)

它的行为正如它所记录的那样。 PrintStream.println(String)记录为:

  

打印字符串然后终止该行。此方法的行为就像调用print(String)然后调用println()

PrintStream.print(String)记录为:

  

打印一个字符串。如果参数为null,则打印字符串"null"。否则,字符串的字符将根据平台的默认字符编码转换为字节,这些字节的编写方式与write(int)方法完全相同。

如有疑问,请阅读文档:)

答案 1 :(得分:6)

因为它最终到达print方法,打印" null"对于null String

public void println(String x) {
    synchronized (lock) {
        print(x);
        println();
    }
}

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

打印任何空引用都存在相同的行为(在这种情况下," null" String由String.valueOf(null)返回:

public void println(Object x) {
    String s = String.valueOf(x);
    synchronized (lock) {
        print(s);
        println();
    }
}

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

答案 2 :(得分:2)

您可以查看PrintStream源代码:

public void println(String x) {
    synchronized (this) {
        print(x);
        newLine();
    }
}

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

如您所见,null案例仅通过打印“null”来处理。

答案 3 :(得分:1)

Null在打印功能中是特殊的:

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

答案 4 :(得分:0)

根据PrintStream#println()

  

打印一个对象,然后终止该行。此方法首先调用String.valueOf(x)来获取打印对象的字符串值,然后表现为调用print(String)然后调用println()。

根据String#valueOf

  

返回Object参数的字符串表示形式。   如果参数为null,则字符串等于“null”;否则,返回obj.toString()的值。

答案 5 :(得分:0)

System.out.print函数源代码。如果print string为null,则设置为" null"

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

答案 6 :(得分:0)

在某些情况下,NullPointerException可能会抛出toString(),让您认为它是如何运作的。

如果您有一个复杂的对象,您已经创建了自己的null方法,则该方法可能会发生错误。您可能会意外或故意编码,以便NPE确实发生。对象本身不为null,但是其中的一些属性可能为null。

这种编码很可能不应该被劝阻,因为它确实打破了合同,正如其他人指出的那样。期望的行为是将空对象表示为me!DC = dlookup("DCName","PC", "PCArea = '" & me!PcAreaDropDown & "'" 而不是抛出NPE。