1. 程式人生 > >System.out.println()中傳入null會發生什麼

System.out.println()中傳入null會發生什麼

之前做了思科大資料開發工程師的筆試題,其中有一道題目是判斷一段Java程式碼的輸出結果,最後實質上是判斷System.out.println()括號中如果傳入null會輸出什麼。大公司考的題目都很細很考驗功底,所以記錄下這個平時有些忽略的細節。在回顧當時的題目時,找到一個國外大學的教師寫的部落格講得很詳細:

主要的意思就是,System.out.println()括號中如果傳入null,不同形式的null最終的輸出也不同。如果是直接傳入null:

System.out.println(null);

會在編譯時報錯,即無法確定傳入的值是屬於字元陣列物件還是String物件,錯誤資訊如下:

reference to println is ambiguous, both
method println(char[]) in java.io.PrintStream and
method println(java.lang.String) in java.io.PrintStream match

也就是說,System.out.println()在輸出結果的時候括號內的引數有兩種,char[]和String(或Object)。一般必須顯式指定傳入的值所屬的物件類別。如果傳入Object或String物件:

Object o = null;
String s = null;
System.out.println(o);
System.out.println(s);

輸出如下所示:

null
null

所以如果傳入的null值是Object或者String物件的形式,最終的輸出就是null。但如果傳入的是字元陣列char[]:

char[] a = null;
System.out.println(a);

最終會丟擲空指標異常,如下所示:

Exception in thread "main" java.lang.NullPointerException
    at java.io.Writer.write(Writer.java:127)
    at java.io.PrintStream.write(PrintStream.java:470)
    at java.io.PrintStream.print(PrintStream.java:620)
    at java.io.PrintStream.println(PrintStream.java:759)
    ...

因為陣列的引用指向null,所以訪問該字元陣列物件時就會找不到實際的char[]例項,就不會有正常輸出。