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()方法實際上調(diào)用了兩個方法。
而print方法調(diào)用了String.valueOf(s)這個靜態(tài)方法,該方法在將對象轉(zhuǎn)換為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í)行結(jié)果如下:
java.lang.NullPointerException
at GjcTest.main(GjcTest.java:5)
null
問題1:String類型null對象為什么會被打印成null?
當我們調(diào)用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í)行結(jié)果如下:
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); }
嗯?怎么調(diào)用的是參數(shù)類型是String類型的方法?
哦,原來在println方法中,調(diào)用print方法參數(shù)類型是String類的,那么問題應該是在println源碼中第2行valueOf方法中。
valueOf方法源碼如下:
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }
這個問題就解決了,如果傳入的引用類型對象是null,那么返回字符串“null”,否則調(diào)用對象的toString方法。
心得
String類型null對象處理方式:判斷對象是否是null,如果是null,打印字符串“null”;如果不是null,打印字符串。
非String類型null對象處理方式:判斷對象是否是null,如果是null,打印字符串“null”;如果不是null,調(diào)用對象的toString方法,并打印字符串。
我的疑問
如圖所示:
println(Object o)處理邏輯是調(diào)用String.valueOf()方法,判斷對象o是否為空并返回需要打印的字符串,然后調(diào)用print(String s)打印出來。
為什么println(Object o)不直接調(diào)用print(Object o)呢,代碼如下。
是設(shè)計者就是這樣設(shè)計的,還是有什么原因?
public void println(Object x) { synchronized (this) { print(x); newLine(); } }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
JMeter參數(shù)化4種實現(xiàn)方式(小結(jié))
參數(shù)化是自動化測試腳本的一種常用技巧,可將腳本中的某些輸入使用參數(shù)來代替,JMeter提供了多種參數(shù)化方式,下面就其中常用的4種展開闡述,感興趣的可以來了解一下2021-12-12Springboot 接收POST、json、文本數(shù)據(jù)的方法 附示例
這篇文章主要介紹了Springboot 接收POST、json、文本數(shù)據(jù)實踐,如果把 json 作為參數(shù)傳遞,我們可以使用 @requestbody 接收參數(shù),將數(shù)據(jù)直接轉(zhuǎn)換成對象,本文通過示例代碼介紹的非常詳細,需要的朋友可以參考下2023-10-10spring boot org.junit.jupiter.api不存在的解決
這篇文章主要介紹了spring boot org.junit.jupiter.api不存在的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09Spring Aop 如何獲取參數(shù)名參數(shù)值
這篇文章主要介紹了Spring Aop 如何獲取參數(shù)名參數(shù)值的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07