[英]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.