簡體   English   中英

為什么System.out.println()沒有拋出NullPointerException?

[英]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()

PrintStream.print(String)記錄為:

打印一個字符串。 如果參數為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);
}

根據PrintStream#println()

打印一個對象,然后終止該行。 此方法首先調用String.valueOf(x)來獲取打印對象的字符串值,然后表現為調用print(String)然后調用println()。

根據String#valueOf

返回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM