欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java中對(duì)象為null時(shí)的打印輸出方式

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

java對(duì)象為null時(shí)的打印輸出

在寫(xiě)代碼時(shí),突然好奇當(dāng)一個(gè)對(duì)象為空時(shí),打印輸出為何是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三個(gè)對(duì)象,以上代碼的輸出如下,均為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()方法實(shí)際上調(diào)用了兩個(gè)方法。

而print方法調(diào)用了String.valueOf(s)這個(gè)靜態(tài)方法,該方法在將對(duì)象轉(zhuǎn)換為String時(shí),會(huì)判斷對(duì)象是否為空(即為null),若對(duì)象為空,則直接返回字符串"null"。

null對(duì)象打印為什么是null?

JAVA中有八種基本數(shù)據(jù)類(lèi)型,他們?cè)诔跏蓟臅r(shí)候會(huì)被賦予初始值。

byte -> 0
short -> 0
int -> 0
long -> 0
char -> " "(看起來(lái)像是一個(gè)空格)
float -> 0.0
double -> 0.0
boolean -> false

引用類(lèi)型對(duì)象初始化會(huì)被賦予初始值: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

問(wèn)題1:String類(lèi)型null對(duì)象為什么會(huì)被打印成null?

當(dāng)我們調(diào)用null對(duì)象的方法時(shí),會(huì)拋出異常。但是我們打印null對(duì)象卻不會(huì)拋出異常,感覺(jué)是println方法對(duì)null對(duì)象做了什么處理。

println方法源碼如下:

public void println(String x) {
    synchronized (this) {
        print(x);
        newLine();
    }
}

嗯,答案可能在方法print中,我們打開(kāi)print方法源碼:

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

嗯,簡(jiǎn)單粗暴的處理方式,如果傳入String對(duì)象是null,則直接打印字符串“null”。

那如果是引用類(lèi)型呢?我們就以Integer類(lèi)作為示例。

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

問(wèn)題2:非String類(lèi)型null對(duì)象為什么會(huì)被打印成null?

我們先看一下println源碼:

public void println(Object x) {
    String s = String.valueOf(x);
    synchronized (this) {
        print(s);
        newLine();
    }
}

第一感覺(jué)是print方法應(yīng)該是對(duì)null對(duì)象進(jìn)行了處理的,我們直接打開(kāi)print方法源碼:

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

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

哦,原來(lái)在println方法中,調(diào)用print方法參數(shù)類(lèi)型是String類(lèi)的,那么問(wèn)題應(yīng)該是在println源碼中第2行valueOf方法中。

valueOf方法源碼如下:

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

這個(gè)問(wèn)題就解決了,如果傳入的引用類(lèi)型對(duì)象是null,那么返回字符串“null”,否則調(diào)用對(duì)象的toString方法。

心得

String類(lèi)型null對(duì)象處理方式:判斷對(duì)象是否是null,如果是null,打印字符串“null”;如果不是null,打印字符串。

非String類(lèi)型null對(duì)象處理方式:判斷對(duì)象是否是null,如果是null,打印字符串“null”;如果不是null,調(diào)用對(duì)象的toString方法,并打印字符串。

我的疑問(wèn)

如圖所示:

println(Object o)處理邏輯是調(diào)用String.valueOf()方法,判斷對(duì)象o是否為空并返回需要打印的字符串,然后調(diào)用print(String s)打印出來(lái)。

為什么println(Object o)不直接調(diào)用print(Object o)呢,代碼如下。

是設(shè)計(jì)者就是這樣設(shè)計(jì)的,還是有什么原因?

public void println(Object x) {
    synchronized (this) {
        print(x);
        newLine();
    }
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • JMeter參數(shù)化4種實(shí)現(xiàn)方式(小結(jié))

    JMeter參數(shù)化4種實(shí)現(xiàn)方式(小結(jié))

    參數(shù)化是自動(dòng)化測(cè)試腳本的一種常用技巧,可將腳本中的某些輸入使用參數(shù)來(lái)代替,JMeter提供了多種參數(shù)化方式,下面就其中常用的4種展開(kāi)闡述,感興趣的可以來(lái)了解一下
    2021-12-12
  • 詳解Spring 注解之@Import 注入的各種花活

    詳解Spring 注解之@Import 注入的各種花活

    這篇文章主要介紹了詳解Spring 注解之@Import 注入的各種花活,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Springboot 接收POST、json、文本數(shù)據(jù)的方法 附示例

    Springboot 接收POST、json、文本數(shù)據(jù)的方法 附示例

    這篇文章主要介紹了Springboot 接收POST、json、文本數(shù)據(jù)實(shí)踐,如果把 json 作為參數(shù)傳遞,我們可以使用 @requestbody 接收參數(shù),將數(shù)據(jù)直接轉(zhuǎn)換成對(duì)象,本文通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • Java中空指針異常的幾種解決方案

    Java中空指針異常的幾種解決方案

    這篇文章主要介紹了Java中空指針異常的幾種解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • spring boot org.junit.jupiter.api不存在的解決

    spring boot org.junit.jupiter.api不存在的解決

    這篇文章主要介紹了spring boot org.junit.jupiter.api不存在的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 詳解Java ArrayList類(lèi)

    詳解Java ArrayList類(lèi)

    這篇文章主要介紹了Java ArrayList類(lèi)的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 淺談java中null是什么,以及使用中要注意的事項(xiàng)

    淺談java中null是什么,以及使用中要注意的事項(xiàng)

    下面小編就為大家?guī)?lái)一篇淺談java中null是什么,以及使用中要注意的事項(xiàng)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • Spring Aop 如何獲取參數(shù)名參數(shù)值

    Spring Aop 如何獲取參數(shù)名參數(shù)值

    這篇文章主要介紹了Spring Aop 如何獲取參數(shù)名參數(shù)值的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • MyBatisPlus條件構(gòu)造器圖文實(shí)例詳解

    MyBatisPlus條件構(gòu)造器圖文實(shí)例詳解

    這篇文章主要介紹了MyBatisPlus條件構(gòu)造器,了解內(nèi)部原理是為了幫助我們做擴(kuò)展,同時(shí)也是驗(yàn)證了一個(gè)人的學(xué)習(xí)能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會(huì)的
    2023-01-01
  • Java劍指offer之刪除鏈表的節(jié)點(diǎn)

    Java劍指offer之刪除鏈表的節(jié)點(diǎn)

    這篇文章主要介紹了Java劍指offer之刪除鏈表的節(jié)點(diǎn),給定單向鏈表的頭指針和一個(gè)要?jiǎng)h除的節(jié)點(diǎn)的值,定義一個(gè)函數(shù)刪除該節(jié)點(diǎn)。返回刪除后的鏈表的頭節(jié)點(diǎn),下文更多相關(guān)內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-04-04

最新評(píng)論