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

詳解Java中finally和return的執(zhí)行順序

 更新時(shí)間:2024年01月12日 14:22:52   作者:tracydragonlxy  
try-catch-finally是一種針對程序運(yùn)行時(shí)出錯(cuò)的響應(yīng)手段,對于一些可以預(yù)料到的出錯(cuò)類型,在發(fā)生時(shí)對其進(jìn)行報(bào)告和補(bǔ)救,這篇文章主要介紹了Java中finally和return的執(zhí)行順序,需要的朋友可以參考下

Java中finally和return的執(zhí)行順序 

try…catch…finally

try-catch-finally是一種針對程序運(yùn)行時(shí)出錯(cuò)的響應(yīng)手段,對于一些可以預(yù)料到的出錯(cuò)類型,在發(fā)生時(shí)對其進(jìn)行報(bào)告和補(bǔ)救。其使用流程如下:首先執(zhí)行try中的語句,如果try中的語句報(bào)錯(cuò)了,那么就轉(zhuǎn)入對應(yīng)的catch語句中執(zhí)行處理異常的措施,catch后的語句中的內(nèi)容是對應(yīng)的錯(cuò)誤類型。無論異常是否發(fā)生,finally中的內(nèi)容一定是會(huì)被執(zhí)行的,一般用來釋放資源,并確保某些操作一定會(huì)執(zhí)行。當(dāng)try和catch中有return時(shí),finally中代碼仍然會(huì)執(zhí)行。

其使用的格式如下:

try {
} catch (IOException e) {
} finally { // 關(guān)閉資源
    res.close();
}

1. finally語句在return語句執(zhí)行之后return返回之前執(zhí)行的

public class TestTryFinally {
    public static void main(String[] args) {
        System.out.println(test01());
    }
    private static int test01() {
        int num = 0;
        try {
            System.out.println("try block");
            num = 10;
            return num;            
        } catch (Exception e) {
            System.out.println("catch block");
        } finally {
            System.out.println("finally block");
            num = 30;
        }
        return num;
    }
}

輸出結(jié)果:
try block
finally block
10

說明return語句已經(jīng)執(zhí)行了再去執(zhí)行finally語句,不過并沒有直接返回,而是等finally語句執(zhí)行完了再返回結(jié)果。

public class TestTryFinally {
    public static void main(String[] args) {
        System.out.println(test02());
    }
    private static String test02() {
        try {
            System.out.println("try block");
            return test03();
        } catch (Exception e) {
            System.out.println("catch block");
        } finally {
            System.out.println("finally block");
        }
        return "";
    }
    private static String test03() {
        System.out.println("invoke method: test03()");
        return "method test03() return";
    }
}

輸出結(jié)果:
try block
invoke method: test03()
finally block
method test03() return

說明try中的return語句先執(zhí)行了但并沒有立即返回,等到finally執(zhí)行結(jié)束后再返回。

2. finally塊中的return語句會(huì)覆蓋try塊中的return返回

public class TestTryFinally {
    public static void main(String[] args) {
        System.out.println(test04());
    }
    /*
     * finally塊中的return語句會(huì)覆蓋try塊中的return返回
     */
    private static String test04() {
        String s = "init";
        try {
            System.out.println("try block");
            return "try";            
        } catch (Exception e) {
            System.out.println("catch block");
        } finally {
            System.out.println("finally block");
            return "finally";
        }
        // return s;
    }
}

輸出結(jié)果:
try block
finally block
finally

這說明finally里的return直接返回了,就不管try中是否還有返回語句,這里還有個(gè)小細(xì)節(jié)需要注意,finally里加上return過后,finally外面的return s就變成不可到達(dá)語句了,也就是永遠(yuǎn)不能被執(zhí)行到,所以需要注釋掉否則編譯器報(bào)錯(cuò)。

3. 如果finally語句中沒有return語句覆蓋返回值,那么原來的返回值可能因?yàn)閒inally里的修改而改變也可能不變。

import java.util.*;
public class TestTryFinally {
    public static void main(String[] args) {
    	System.out.println(test01());
        System.out.println("######################");
        System.out.println(getMap().get("key").toString());
    }
    private static int test01() {
        int num = 0;
        try {
            System.out.println("try block");
            num = 10;
            return num;            
        } catch (Exception e) {
            System.out.println("catch block");
        } finally {
            System.out.println("finally block");
            num = 30;
        }
        return num;
    }
    public static Map<String, String> getMap() {
        Map<String, String> map = new HashMap<String, String>();
        map.put("KEY", "INIT");
        try {
            map.put("KEY", "TRY");
            return map;
        } catch (Exception e) {
            map.put("KEY", "CATCH");
        } finally {
            map.put("KEY", "FINALLY");
            map = null;
        }
        return map;
    }
}

我們先來看一下AI(ChatGPT3.5,Bard和文心一言3.5)給出的答案是什么。我們可以看到ChatGPT文心一言給出的結(jié)果是:程序會(huì)拋出NullPointerException異常,而Bard給出的結(jié)果為:TRY。

而實(shí)際運(yùn)行代碼,我們得到的結(jié)果為:FINALLY

輸出結(jié)果:
try block
finally block
10
######################
try block
finally block
finally

為什么test01()finally里的num = 30;并沒有起到作用,而getMap()finallymap.put("key", "finally");起了作用,而map = null;卻沒起作用呢?這就是Java到底是傳值還是傳址的問題了,簡單來說就是:Java中只有傳值沒有傳址,這也是為什么map = null這句不起作用。

4. try塊里的return語句在異常的情況下不會(huì)被執(zhí)行

    public static void main(String[] args) {
        System.out.println(test06());
    }
    private static int test05() {
        int num = 10;
        try {
            System.out.println("try block");
            num = 5 / 0;
            return num;
        } catch (Exception e) {
            System.out.println("catch block");
            num += 20;
        } finally {
            System.out.println("finally block");
            num += 30;
        }
        return num;
    }

輸出結(jié)果:
try block
catch block
finally block
60

try語句塊中發(fā)生了除0異常,所以try中的return不會(huì)被執(zhí)行到,而是接著執(zhí)行捕獲異常的catch語句和最終的finally語句,此時(shí)兩者對num的修改都影響了最終的返回值。

5. 當(dāng)發(fā)生異常后,catch中的return執(zhí)行情況與未發(fā)生異常時(shí)try中return的執(zhí)行情況完全一樣

    public static void main(String[] args) {
        System.out.println(test06());
    }
    private static int test06() {
        int num = 10;
        try {
            System.out.println("try block");
            num = 5 / 0;
            return num;
        } catch (Exception e) {
            System.out.println("catch block");
            num += 20;
            return num;
        } finally {
            System.out.println("finally block");
            num += 30;
        }
        // return num;
    }

輸出結(jié)果:
try block
catch block
finally block
30

說明了發(fā)生異常后,catch中的return語句先執(zhí)行,確定了返回值后再去執(zhí)行finally塊,執(zhí)行完了catch再返回,finally里對num的改變對返回值無影響,原因同前面一樣,也就是說情況與try中的return語句執(zhí)行完全一樣。

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

相關(guān)文章

  • Java技巧函數(shù)方法實(shí)現(xiàn)二維數(shù)組遍歷

    Java技巧函數(shù)方法實(shí)現(xiàn)二維數(shù)組遍歷

    這篇文章主要介紹了Java技巧函數(shù)方法實(shí)現(xiàn)二維數(shù)組遍歷,二維數(shù)組遍歷,每個(gè)元素判斷下是否為偶數(shù),相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-08-08
  • 詳解Springboot集成sentinel實(shí)現(xiàn)接口限流入門

    詳解Springboot集成sentinel實(shí)現(xiàn)接口限流入門

    這篇文章主要介紹了詳解Springboot集成sentinel實(shí)現(xiàn)接口限流入門,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • SpringBoot使用Apache Tika實(shí)現(xiàn)多種文檔的內(nèi)容解析

    SpringBoot使用Apache Tika實(shí)現(xiàn)多種文檔的內(nèi)容解析

    在日常開發(fā)中,我們經(jīng)常需要解析不同類型的文檔,如PDF、Word、Excel、HTML、TXT等,Apache Tika是一個(gè)強(qiáng)大的內(nèi)容解析工具,可以輕松地提取文檔中的內(nèi)容和元數(shù)據(jù)信息,本文將通過SpringBoot和Apache Tika的結(jié)合,介紹如何實(shí)現(xiàn)對多種文檔格式的內(nèi)容解析
    2024-12-12
  • Java程序中添加播放MIDI音樂功能的實(shí)現(xiàn)方法詳解

    Java程序中添加播放MIDI音樂功能的實(shí)現(xiàn)方法詳解

    本篇文章是對在Java程序中添加播放MIDI音樂功能的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Java中線程用法總結(jié)

    Java中線程用法總結(jié)

    這篇文章主要介紹了Java中線程用法,實(shí)例總結(jié)了java中線程的常見使用技巧,需要的朋友可以參考下
    2015-06-06
  • 如何在Springboot實(shí)現(xiàn)攔截器功能

    如何在Springboot實(shí)現(xiàn)攔截器功能

    其實(shí)spring boot攔截器的配置方式和springMVC差不多,只有一些小的改變需要注意下就ok了,下面這篇文章主要給大家介紹了關(guān)于如何在Springboot實(shí)現(xiàn)攔截器功能的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Java顯式鎖詳情

    Java顯式鎖詳情

    這篇文章主要詳細(xì)的介紹了shenJava顯式鎖常用的api及標(biāo)準(zhǔn)用法,感興趣的朋友,需要的朋友可以參考下面文章里的內(nèi)容
    2021-09-09
  • SpringBoot默認(rèn)配置的具體使用

    SpringBoot默認(rèn)配置的具體使用

    本文主要介紹了SpringBoot默認(rèn)配置的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-08-08
  • SpringMVC 傳日期參數(shù)到后臺(tái)的實(shí)例講解

    SpringMVC 傳日期參數(shù)到后臺(tái)的實(shí)例講解

    下面小編就為大家分享一篇SpringMVC 傳日期參數(shù)到后臺(tái)的實(shí)例講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • java 字符串截取的實(shí)例詳解

    java 字符串截取的實(shí)例詳解

    這篇文章主要介紹了java 字符串截取的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09

最新評論

临城县| 尚义县| 弋阳县| 阜阳市| 华宁县| 瓦房店市| 高密市| 汽车| 大宁县| 海门市| 泊头市| 千阳县| 库车县| 米易县| 伊川县| 丰原市| 三穗县| 阜平县| 应城市| 固原市| 齐齐哈尔市| 宁阳县| 鄯善县| 麟游县| 南涧| 乾安县| 九龙县| 瓦房店市| 莆田市| 雷波县| 昂仁县| 青浦区| 和林格尔县| 平江县| 正阳县| 彭州市| 桑植县| 北票市| 长宁区| 山丹县| 明溪县|