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

Java中try-catch-finally執(zhí)行順序你知道嗎

 更新時(shí)間:2022年06月17日 15:56:22   作者:Andrew_Wang  
本文主要介紹了try-catch-finally執(zhí)行順序你知道嗎,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

引言

java異常處理中,try、catch、finally的執(zhí)行順序,大家都知道是按順序執(zhí)行的,這里我就不廢話了。但是當(dāng)try、catch、finally中加入return之后,就會(huì)有幾種不同的情況出現(xiàn),下面分別來說明一下。也可以跳到最后直接看總結(jié)。

正文

這里共列舉五種情況,會(huì)對其一一說明。

try塊中有return

try{
    System.out.println("try塊代碼運(yùn)行了");
    return 0;
}catch(Exception e){
    System.out.println("catch塊代碼運(yùn)行了");
}finally {
    System.out.println("finally塊代碼運(yùn)行了");
}
return 1;

輸出結(jié)果:

try塊代碼運(yùn)行了
finally塊代碼運(yùn)行了
?
最終返回:0

執(zhí)行流程:

執(zhí)行try塊中return前(包括return語句中的表達(dá)式運(yùn)算)的代碼 -> 執(zhí)行finally塊 -> 執(zhí)行try中return。

結(jié)論:

當(dāng)try中帶有return時(shí),會(huì)先執(zhí)行return前的代碼,然后暫時(shí)保存需要return的信息,再執(zhí)行finally中的代碼,最后再通過return返回之前保存的信息。finally塊之后的語句return不再執(zhí)行,因?yàn)槌绦蛟趖ry中已經(jīng)return過了,方法的執(zhí)行已經(jīng)結(jié)束。

但有一點(diǎn)需要注意,如果返回值是引用類型呢?再看另外一個(gè)例子:

List<Integer> list = new ArrayList<>();
try {
    list.add(0);
    System.out.println("try:" + list);
    return list;
} catch (Exception e) {
    list.add(1);
    System.out.println("catch:" + list);
} finally {
    list.add(2);
    System.out.println("finally:" + list);
}
return list;

輸出:

try:[0]
finally:[0,2]
?
最終返回:[0,2]

看完這個(gè)例子,可能會(huì)發(fā)現(xiàn)問題,剛提到return時(shí)會(huì)臨時(shí)保存需要返回的信息,不受finally塊中代碼的影響。但是在這里,list里存的不是變量本身,而是變量的地址,所以當(dāng)finally通過地址改變了變量,還是會(huì)影響方法返回值的。

catch塊中有return

try{
    System.out.println("try塊代碼運(yùn)行了");
    //int x = 1 / 0 ;
}catch(Exception e){
    System.out.println("catch塊代碼運(yùn)行了");
    return 0;
}finally {
    System.out.println("finally塊代碼運(yùn)行了");
}
return 1;

輸出結(jié)果:

//無異常
try塊代碼運(yùn)行了
finally塊代碼運(yùn)行了
    
最終返回:1
//有異常
try塊代碼運(yùn)行了
catch塊代碼運(yùn)行了
finally塊代碼運(yùn)行了
    
最終返回:0

執(zhí)行流程:

程序先執(zhí)行try,如果遇到異常執(zhí)行catch塊。

有異常:執(zhí)行catch中return之前(包括return語句中的表達(dá)式運(yùn)算)代碼,再執(zhí)行finally語句中全部代碼,最后執(zhí)行catch塊中return, finally之后的return不再執(zhí)行。

無異常:執(zhí)行完try再finally再return。

結(jié)論:

catch中return與try中類似,若出現(xiàn)異常,會(huì)暫時(shí)保存catch塊中return的信息,再執(zhí)行finally中的代碼,最后再通過return返回之前保存的信息。

try塊和finally塊中有return

try{
    System.out.println("try塊代碼運(yùn)行了");
    return 0;
}catch(Exception e){
    System.out.println("catch塊代碼運(yùn)行了");
?
}finally {
    System.out.println("finally塊代碼運(yùn)行了");
    return 1;
}

輸出結(jié)果:

try塊代碼運(yùn)行了
finally塊代碼運(yùn)行了
    
最終返回:1

執(zhí)行流程:

程序執(zhí)行try塊中return之前(包括return語句中的表達(dá)式運(yùn)算)代碼,再執(zhí)行finally塊。因?yàn)閒inally塊中有return所以提前退出,而不再執(zhí)行try中的return。

備注:

這種寫法是可以編譯通過的,但是編譯器會(huì)給予警告。我們一般不在finally塊中寫return語句,這里只是刻意演示了一下效果。

catch塊和finally塊中有return

try{
    System.out.println("try塊代碼運(yùn)行了");
    //int x = 1 / 0 ;
}catch(Exception e){
    System.out.println("catch塊代碼運(yùn)行了");
    return 0;
}finally {
    System.out.println("finally塊代碼運(yùn)行了");
    return 1;
}

輸出結(jié)果:

//無異常
try塊代碼運(yùn)行了
finally塊代碼運(yùn)行了
    
最終返回:1

//有異常
try塊代碼運(yùn)行了
catch塊代碼運(yùn)行了
finally塊代碼運(yùn)行了
    
最終返回:1

執(zhí)行流程:

無異常:執(zhí)行try后跳過catch執(zhí)行finally,得到finally的返回值1;

有異常:程序執(zhí)行catch塊中return之前(包括return語句中的表達(dá)式運(yùn)算)代碼,再執(zhí)行finally塊。因?yàn)閒inally塊中有return所以提前退出,而不再執(zhí)行catch中的return。

try塊、catch塊和finally塊中都有return

try{
    System.out.println("try塊代碼運(yùn)行了");
    //int x = 1 / 0 ;
    return 0;
}catch(Exception e){
    System.out.println("catch塊代碼運(yùn)行了");
    return 1;
}finally {
    System.out.println("finally塊代碼運(yùn)行了");
    return 2;
}

輸出結(jié)果:

//無異常
try塊代碼運(yùn)行了
finally塊代碼運(yùn)行了

最終返回:2
    
//有異常
try塊代碼運(yùn)行了
catch塊代碼運(yùn)行了
finally塊代碼運(yùn)行了

最終返回:2    

執(zhí)行流程:

程序執(zhí)行try塊中return之前(包括return語句中的表達(dá)式運(yùn)算)代碼,

無異常:然后再執(zhí)行finally塊,因?yàn)閒inally塊中有return所以提前退出;

有異常:執(zhí)行catch塊中return之前(包括return語句中的表達(dá)式運(yùn)算)代碼,再執(zhí)行finally塊。因?yàn)閒inally塊中有return所以提前退出。

結(jié)論:

得到finally中的返回值3。

總結(jié)

  • 無論catch是否捕獲異常,finally語句塊都是要被執(zhí)行的。

  • 當(dāng)try塊或catch塊return一個(gè)值,那么finally塊中的代碼會(huì)在執(zhí)行return后,返回之前執(zhí)行。(此時(shí)并沒有返回運(yùn)算后的值,而是把要返回的值暫時(shí)保存起來)。

  • finally中如果包含return,那么程序?qū)?strong>在這里返回,而不是通過try或catch中的return返回,返回值就不是try或catch中保存的返回值了。會(huì)直接在finally中結(jié)束方法的執(zhí)行,導(dǎo)致try、catch中的return失效

  • 當(dāng)try或catch,finally中都包含return的時(shí)候,要注意返回值的類型。finally修改的基本類型是不影響返回結(jié)果的,修改list、map、自定義類等引用類型時(shí),是影響返回結(jié)果的。

  • 編譯器會(huì)對finally中的return給予警告,因?yàn)閺膄inally中返回可能會(huì)導(dǎo)致異常丟失 。如:

    try
    {
        try
        {
            throw new RuntimeException("來自try塊中的異常") ;
        }finally{  
            return;
        }
    }
    catch (Exception e)
    {
        e.printStackTrace(System.out) ;
    }

    這里無法捕獲 我們自定義的運(yùn)行時(shí)異常。

    又如:

    try
    {
        try
        {
            throw new RuntimeException("來自try塊中的異常") ;
        }finally{
            throw new RuntimeException("來自finally塊中的異常") ;
        }
    }
    catch (Exception e)
    {
        e.printStackTrace(System.out) ;
    }

    這里會(huì)丟失 第一個(gè)異常。

到此這篇關(guān)于try-catch-finally執(zhí)行順序你知道嗎的文章就介紹到這了,更多相關(guān)try-catch-finally執(zhí)行順序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java并發(fā)編程之CountDownLatch源碼解析

    Java并發(fā)編程之CountDownLatch源碼解析

    這篇文章主要介紹了Java并發(fā)編程之CountDownLatch源碼解析,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java并發(fā)編程的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java簡單計(jì)時(shí)的實(shí)現(xiàn)案例(可以用來限時(shí)循環(huán))

    Java簡單計(jì)時(shí)的實(shí)現(xiàn)案例(可以用來限時(shí)循環(huán))

    這篇文章主要介紹了Java簡單計(jì)時(shí)的實(shí)現(xiàn)案例(可以用來限時(shí)循環(huán)),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • SpringBoot自定義定時(shí)任務(wù)的實(shí)現(xiàn)示例

    SpringBoot自定義定時(shí)任務(wù)的實(shí)現(xiàn)示例

    本文主要介紹了SpringBoot自定義定時(shí)任務(wù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • 實(shí)例詳解java Struts2的配置與簡單案例

    實(shí)例詳解java Struts2的配置與簡單案例

    這篇文章主要介紹了java Struts2的配置與簡單案例,需要的朋友可以參考下
    2017-04-04
  • Java如何從List中刪除元素的正確用法舉例

    Java如何從List中刪除元素的正確用法舉例

    這篇文章主要給大家介紹了關(guān)于Java如何從List中刪除元素的正確用法, 列表List是Java中的一種數(shù)據(jù)結(jié)構(gòu),存放按照添加順序的元素,是個(gè)有序的集合,需要的朋友可以參考下
    2023-07-07
  • spring通過jdbc連接數(shù)據(jù)庫

    spring通過jdbc連接數(shù)據(jù)庫

    這篇文章主要為大家詳細(xì)介紹了spring通過jdbc連接數(shù)據(jù)庫的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • AsyncHttpClient的默認(rèn)配置源碼流程解讀

    AsyncHttpClient的默認(rèn)配置源碼流程解讀

    這篇文章主要為大家介紹了AsyncHttpClient的默認(rèn)配置源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Springboot中@Async異步,實(shí)現(xiàn)異步結(jié)果合并統(tǒng)一返回方式

    Springboot中@Async異步,實(shí)現(xiàn)異步結(jié)果合并統(tǒng)一返回方式

    這篇文章主要介紹了Springboot中@Async異步,實(shí)現(xiàn)異步結(jié)果合并統(tǒng)一返回方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • IDEA中Spring項(xiàng)目的工程構(gòu)建

    IDEA中Spring項(xiàng)目的工程構(gòu)建

    這篇文章主要介紹了IDEA中Spring項(xiàng)目的工程構(gòu)建,Spring框架是輕量級的JavaEE框架,可以解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性,有兩個(gè)核心部分:IOC和Aop,今天來學(xué)習(xí)如何構(gòu)建spring項(xiàng)目,需要的朋友可以參考下
    2023-05-05
  • Java BigDecimal基礎(chǔ)用法詳解

    Java BigDecimal基礎(chǔ)用法詳解

    Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數(shù)進(jìn)行精確的運(yùn)算。雙精度浮點(diǎn)型變量double可以處理16位有效數(shù),但在實(shí)際應(yīng)用中,可能需要對更大或者更小的數(shù)進(jìn)行運(yùn)算和處理
    2022-06-06

最新評論

和硕县| 营山县| 达日县| 淮北市| 云阳县| 海伦市| 汽车| 磴口县| 景洪市| 涿鹿县| 澎湖县| 麻栗坡县| 尤溪县| 格尔木市| 阿拉尔市| 武邑县| 睢宁县| 长垣县| 河源市| 双桥区| 黄浦区| 徐闻县| 阳谷县| 榆中县| 忻州市| 鄂尔多斯市| 历史| 车致| 庆安县| 克山县| 积石山| 滦南县| 镇坪县| 吴旗县| 九龙城区| 东莞市| 淮安市| 平凉市| 元谋县| 塔河县| 永胜县|