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

Java語言中finally是否一定會執(zhí)行你知道嗎

 更新時間:2022年02月23日 15:10:43   作者:小夏陌  
這篇文章主要為大家詳細介紹了Java finally是否一定會執(zhí)行,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

簡介

我們都知道,finally 作為異常處理的一部分,它只能緊跟在try/catch語句后,附帶一個語句塊,表示這段語句,“在正常情況下”,最終一定會被執(zhí)行(不管有沒有拋出異常),經(jīng)常被用在需要釋放資源的情況下。那么在我們的應用在運行中,一定會運行finally代碼塊嗎?其實不是的,有以下幾種情況我們的finally代碼塊是不會運行的。

finally 代碼塊不會運行的情況

情況一:代碼流程并未進入try語句塊

這也是最好理解的情況,如果代碼流程不進入try代碼塊,則相應的catch和finally代碼塊自然不會執(zhí)行。

	public static void main(String[] args) {
        int i = 0;
        System.out.println("enter main block");
        boolean flag = false;
        if (flag) {
            try {
                System.out.println("enter try block");
                i = i / i;
            } catch (Exception e) {
                System.out.println("enter catch block");
            }finally {
                System.out.println("enter finally block");
            }
        }
    }

運行結(jié)果為:

enter main block

情況二: 使用了 System.exit(int) 退出程序

在進入try或catch塊后,使用了 System.exit(int) 退出程序。

	public static void main(String[] args) {
        int i = 0;
        System.out.println("enter main block");
        try {
            System.out.println("enter try block");
            System.exit(0);
            i = i / i;
        } catch (Exception e) {
            System.out.println("enter catch block");
        } finally {
            System.out.println("enter finally block");
        }
    }

public static void main(String[] args) {
        int i = 0;
        System.out.println("enter main block");
        try {
            System.out.println("enter try block");
            i = i / i;
        } catch (Exception e) {
            System.exit(0);
            System.out.println("enter catch block");
        } finally {
            System.out.println("enter finally block");
        }
    }

運行結(jié)果為:

enter main block
enter try block

但是呢,如果 System.exit(int) 在try代碼塊異常語句之后, finally 還是會被執(zhí)行,因為已經(jīng)沒有機會執(zhí)行 System.exit(int) ,程序已經(jīng)退出了,比如:

	public static void main(String[] args) {
        int i = 0;
        System.out.println("enter main block");
        try {
            System.out.println("enter try block");
            i = i / i;
            System.exit(0);
        } catch (Exception e) {
            System.out.println("enter catch block");
        } finally {
            System.out.println("enter finally block");
        }
    }

運行結(jié)果為:

enter main block
enter try block
enter catch block
enter finally block

情況三:程序所在的線程死亡

在當前線程死亡的情況下,finally里的語句也不會執(zhí)行,比如干擾中斷,或者程序外部kill該線程,或者是意外中止。

	public static void main(String[] args) {
        int i = 0;
        System.out.println("enter main block");
        try {
            System.out.println("enter try block");
            // 模擬執(zhí)行任務10s,然后在執(zhí)行任務過程中殺死該線程
            Thread.sleep(10 * 1000);
            i = i / i;
        } catch (Exception e) {
            System.out.println("enter catch block");
        } finally {
            System.out.println("enter finally block");
        }
    }

這里在休眠里,用kill命令,殺死該線程,模擬非正常退出,最后運行結(jié)果為:

enter main block
enter try block

這里值得注意的是,我們常常在try語句塊里獲取了一些臨界資源,然后finally語句塊里釋放該資源。此時,如果正常獲得取資源后,程序非正常中斷,則我們并未正常釋放該資源,就會導致資源可能會被無限占用,所以這里要考慮一下其它的解決方法,比如給資源設置一個使用時間等,到期自動收回。

情況四:其它非正常退出

還有其它非正常退出(道理同上,就不演示了),也會導致finally代碼塊不執(zhí)行,比如物理關閉電源,關閉 CPU等。這些其實在開發(fā)生產(chǎn)環(huán)境中是常有出現(xiàn)的,比如在開發(fā)中,某一臺服務器獲取鎖后,不小心斷電或宕機了(未成功釋放鎖),然后導致別的機器也不能獲得到鎖(如果鎖無時間限制),最終導致出現(xiàn)系統(tǒng)型的問題。完事以后,你們開發(fā)也不知道發(fā)生了什么事,就把所有服務都重啟了一次,解決了問題,最后說一句:“啊!還是重啟大法好”。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容! 

相關文章

  • SpringBoot注解@CrossOrigin使用詳解

    SpringBoot注解@CrossOrigin使用詳解

    這篇文章主要介紹了SpringBoot注解@CrossOrigin使用詳解,@CrossOrigin是用來處理跨域請求的注解
    跨域,指的是瀏覽器不能執(zhí)行其他網(wǎng)站的腳本,它是由瀏覽器的同源策略造成的,是瀏覽器對JavaScript施加的安全限制,需要的朋友可以參考下
    2023-12-12
  • 詳解SpringBoot是如何保證接口安全的

    詳解SpringBoot是如何保證接口安全的

    對于互聯(lián)網(wǎng)來說,只要你系統(tǒng)的接口會暴露在外網(wǎng),就避免不了接口安全問題。?如果你的接口在外網(wǎng)裸奔,只要讓黑客知道接口的地址和參數(shù)就可以調(diào)用,那簡直就是災難。這篇文章主要介紹了SpringBoot保證接口安全的方法,需要的可以參考一下
    2023-02-02
  • SpringBoot各種事務操作實戰(zhàn)(自動回滾、手動回滾、部分回滾)

    SpringBoot各種事務操作實戰(zhàn)(自動回滾、手動回滾、部分回滾)

    本文主要介紹了SpringBoot各種事務操作實戰(zhàn),包含自動回滾、手動回滾、部分回滾這三種,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-05-05
  • 統(tǒng)一建模語言_動力節(jié)點Java學院整理

    統(tǒng)一建模語言_動力節(jié)點Java學院整理

    這篇文章主要介紹了統(tǒng)一建模語言的相關知識,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧
    2017-06-06
  • 基于mybatis like %%的問題

    基于mybatis like %%的問題

    這篇文章主要介紹了mybatis like %%的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • springboot如何使用yml文件方式配置shardingsphere

    springboot如何使用yml文件方式配置shardingsphere

    這篇文章主要介紹了springboot如何使用yml文件方式配置shardingsphere問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java實現(xiàn)排球比賽計分系統(tǒng)

    Java實現(xiàn)排球比賽計分系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)排球比賽計分系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • java排序高級之選擇排序?qū)崿F(xiàn)方法

    java排序高級之選擇排序?qū)崿F(xiàn)方法

    這篇文章主要介紹了java排序高級之選擇排序?qū)崿F(xiàn)方法,較為全面的分析了選擇排序的原理與具體實現(xiàn)技巧,非常具有實用價值,需要的朋友可以參考下
    2015-02-02
  • 手把手帶你實現(xiàn)第一個Mybatis程序

    手把手帶你實現(xiàn)第一個Mybatis程序

    這篇文章主要介紹了mybatis實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-07-07
  • 通過Java實現(xiàn)中文分詞與文本關鍵詞提取

    通過Java實現(xiàn)中文分詞與文本關鍵詞提取

    這篇文章主要為大家詳細介紹了如何利用Java實現(xiàn)中文分詞以及文本關鍵詞提取功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習學習
    2023-06-06

最新評論

临邑县| 双牌县| 罗甸县| 龙州县| 桐乡市| 鹰潭市| 莲花县| 杭州市| 乾安县| 栾城县| 拜城县| 辛集市| 贵南县| 吴旗县| 古蔺县| 麻城市| 渑池县| 平度市| 花莲市| 巧家县| 拜泉县| 扶风县| 张家港市| 厦门市| 吐鲁番市| 沙坪坝区| 辽阳县| 株洲县| 泰顺县| 荥经县| 榆树市| 南召县| 建始县| 静海县| 敖汉旗| 金山区| 胶南市| 巴东县| 岳阳县| 资兴市| 封开县|