java中對象為null時的打印輸出方式
java對象為null時的打印輸出
在寫代碼時,突然好奇當一個對象為空時,打印輸出為何是null,便作此小記。
public static void main(String[] args) {
String a = null;
String b = "null";
Object c = null;
System.out.println(a);
System.out.println(b);
System.out.println(c);
}我們現(xiàn)在有a\b\c三個對象,以上代碼的輸出如下,均為null。
null
null
null
為了了解為何打印為null,需要查看println()方法的源碼
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}
public void print(String s) {
write(String.valueOf(s));
}
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}可以看到println()方法實際上調用了兩個方法。
而print方法調用了String.valueOf(s)這個靜態(tài)方法,該方法在將對象轉換為String時,會判斷對象是否為空(即為null),若對象為空,則直接返回字符串"null"。
null對象打印為什么是null?
JAVA中有八種基本數(shù)據(jù)類型,他們在初始化的時候會被賦予初始值。
byte -> 0 short -> 0 int -> 0 long -> 0 char -> " "(看起來像是一個空格) float -> 0.0 double -> 0.0 boolean -> false
引用類型對象初始化會被賦予初始值:null
String s = null;
try{
s.toString();
} catch(NullPointerException e){
e.printStackTrace();
}
System.out.println(s);執(zhí)行結果如下:
java.lang.NullPointerException
at GjcTest.main(GjcTest.java:5)
null
問題1:String類型null對象為什么會被打印成null?
當我們調用null對象的方法時,會拋出異常。但是我們打印null對象卻不會拋出異常,感覺是println方法對null對象做了什么處理。
println方法源碼如下:
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}嗯,答案可能在方法print中,我們打開print方法源碼:
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}嗯,簡單粗暴的處理方式,如果傳入String對象是null,則直接打印字符串“null”。
那如果是引用類型呢?我們就以Integer類作為示例。
Integer i = null;
try{
i.toString();
} catch(NullPointerException e){
e.printStackTrace();
}
System.out.println(i);執(zhí)行結果如下:
java.lang.NullPointerException
at GjcTest.main(GjcTest.java:5)
null
問題2:非String類型null對象為什么會被打印成null?
我們先看一下println源碼:
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}第一感覺是print方法應該是對null對象進行了處理的,我們直接打開print方法源碼:
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}嗯?怎么調用的是參數(shù)類型是String類型的方法?
哦,原來在println方法中,調用print方法參數(shù)類型是String類的,那么問題應該是在println源碼中第2行valueOf方法中。
valueOf方法源碼如下:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}這個問題就解決了,如果傳入的引用類型對象是null,那么返回字符串“null”,否則調用對象的toString方法。
心得
String類型null對象處理方式:判斷對象是否是null,如果是null,打印字符串“null”;如果不是null,打印字符串。
非String類型null對象處理方式:判斷對象是否是null,如果是null,打印字符串“null”;如果不是null,調用對象的toString方法,并打印字符串。
我的疑問

如圖所示:
println(Object o)處理邏輯是調用String.valueOf()方法,判斷對象o是否為空并返回需要打印的字符串,然后調用print(String s)打印出來。
為什么println(Object o)不直接調用print(Object o)呢,代碼如下。
是設計者就是這樣設計的,還是有什么原因?
public void println(Object x) {
synchronized (this) {
print(x);
newLine();
}
}總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
基于Java實現(xiàn)楊輝三角 LeetCode Pascal''s Triangle
這篇文章主要介紹了基于Java實現(xiàn)楊輝三角 LeetCode Pascal's Triangle的相關資料,需要的朋友可以參考下2016-01-01
Java利用Spire.XLS?for?Java實現(xiàn)查找并替換Excel中的數(shù)據(jù)
在日常的數(shù)據(jù)處理工作中,Excel?文件無疑是最常見的載體之一,本文將深入探討如何借助?Java?語言和強大的?Spire.XLS?for?Java?自動化處理?Excel?文件的查找替換任務,感興趣的小伙伴可以了解下2025-09-09
Spring的連接數(shù)據(jù)庫以及JDBC模板(實例講解)
下面小編就為大家?guī)硪黄猄pring的連接數(shù)據(jù)庫以及JDBC模板(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
Java中tomcat memecached session 共享同步問題的解決辦法
這篇文章主要介紹了Java中tomcat memecached session 共享同步問題的解決辦法的相關資料,需要的朋友可以參考下2015-10-10
Java?將list集合數(shù)據(jù)按照時間字段排序的方法
這篇文章主要介紹了Java?將list集合數(shù)據(jù)按照時間字段排序,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03
使用MyBatis-Plus實現(xiàn)聯(lián)表查詢分頁的示例代碼
本文主要講述了如何在SpringBoot項目中使用MyBatis-Plus的分頁插件,通過這個示例,可以學會如何利用MyBatis-Plus進行高效的分頁查詢,感興趣的可以了解一下2024-10-10
AsyncHttpClient KeepAliveStrategy源碼流程解讀
這篇文章主要為大家介紹了AsyncHttpClient KeepAliveStrategy源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12

