[英]Why doesn't System.out.println() throw NullPointerException?
这可能是一个非常基本的问题,但我仍然不知道答案。
String abc = null;
System.out.println(abc);
为什么System.out.println
打印“null”并且不抛出NullPointerException
?
它的行为就像它记录的那样。 PrintStream.println(String)
记录为:
打印一个字符串,然后终止该行。 此方法的行为就像调用
print(String)
然后调用println()
。
打印一个字符串。 如果参数为
null
则打印字符串"null"
。 否则,根据平台的默认字符编码将字符串的字符转换为字节,并且这些字节的写入方式与write(int)
方法完全相同。
如有疑问,请阅读文档:)
因为它最终到达print
方法,它为null
String
打印“null”:
public void println(String x) {
synchronized (lock) {
print(x);
println();
}
}
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
打印任何空引用都存在相同的行为(在这种情况下,String.valueOf(null)返回“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();
}
您可以查看PrintStream
源代码:
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
如您所见, null
case仅通过打印“null”来处理。
Null是打印功能中的特殊内容:
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
打印一个对象,然后终止该行。 此方法首先调用String.valueOf(x)来获取打印对象的字符串值,然后表现为调用print(String)然后调用println()。
返回Object参数的字符串表示形式。 如果参数为null,则字符串等于“null”; 否则,返回obj.toString()的值。
System.out.print函数源代码。 如果print string为null,则设置为“null”
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
在某些情况下, System.out.println
可能会抛出NullPointerException
让您认为它是如何工作的。
如果您有一个复杂的对象,您已经创建了自己的toString()
方法,则该方法可能会发生错误。 您可能会意外或故意编码,以便NPE确实发生。 对象本身不为null,但是其中的一些属性可能为null。
这种编码应该很可能不鼓励,因为它确实打破了合同,正如其他人指出的那样。 期望的行为是将null对象表示为null
而不是抛出NPE。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.