最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中對象為null時的打印輸出方式

 更新時間:2023年09月29日 07:21:18   作者:衣有塵  
這篇文章主要介紹了java中對象為null時的打印輸出方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

java對象為null時的打印輸出

在寫代碼時,突然好奇當(dāng)一個對象為空時,打印輸出為何是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?

當(dāng)我們調(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方法應(yīng)該是對null對象進(jìn)行了處理的,我們直接打開print方法源碼:

public void print(String s) {
    if (s == null) {
        s = "null";
    }
    write(s);
}

嗯?怎么調(diào)用的是參數(shù)類型是String類型的方法?

哦,原來在println方法中,調(diào)用print方法參數(shù)類型是String類的,那么問題應(yīng)該是在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)文章

最新評論

武山县| 民乐县| 澄迈县| 乌兰察布市| 时尚| 响水县| 留坝县| 渭源县| 轮台县| 池州市| 牡丹江市| 莲花县| 望谟县| 龙岩市| 临泉县| 鄄城县| 花莲市| 乐昌市| 西安市| 连山| 大安市| 西峡县| 马公市| 蕉岭县| 饶阳县| 西昌市| 平乐县| 确山县| 南阳市| 门头沟区| 桃园市| 奉贤区| 出国| 垫江县| 安溪县| 定西市| 阿鲁科尔沁旗| 婺源县| 财经| 平潭县| 普宁市|