溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中的finally一定會(huì)執(zhí)行嗎

發(fā)布時(shí)間:2022-02-23 16:38:03 來源:億速云 閱讀:498 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Java中的finally一定會(huì)執(zhí)行嗎”,在日常操作中,相信很多人在Java中的finally一定會(huì)執(zhí)行嗎問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”Java中的finally一定會(huì)執(zhí)行嗎”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

    簡介

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

    finally 代碼塊不會(huì)運(yùn)行的情況

    情況一:代碼流程并未進(jìn)入try語句塊

    這也是最好理解的情況,如果代碼流程不進(jìn)入try代碼塊,則相應(yīng)的catch和finally代碼塊自然不會(huì)執(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");
                }
            }
        }

    運(yùn)行結(jié)果為:

    enter main block

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

    在進(jìn)入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");
            }
        }

    運(yùn)行結(jié)果為:

    enter main block
    enter try block

    但是呢,如果 System.exit(int) 在try代碼塊異常語句之后, finally 還是會(huì)被執(zhí)行,因?yàn)橐呀?jīng)沒有機(jī)會(huì)執(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");
            }
        }

    運(yùn)行結(jié)果為:

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

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

    在當(dāng)前線程死亡的情況下,finally里的語句也不會(huì)執(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í)行任務(wù)10s,然后在執(zhí)行任務(wù)過程中殺死該線程
                Thread.sleep(10 * 1000);
                i = i / i;
            } catch (Exception e) {
                System.out.println("enter catch block");
            } finally {
                System.out.println("enter finally block");
            }
        }

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

    enter main block
    enter try block

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

    情況四:其它非正常退出

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

    到此,關(guān)于“Java中的finally一定會(huì)執(zhí)行嗎”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI