您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java中的finally一定會執行嗎”,在日常操作中,相信很多人在Java中的finally一定會執行嗎問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java中的finally一定會執行嗎”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
我們都知道,finally 作為異常處理的一部分,它只能緊跟在try/catch語句后,附帶一個語句塊,表示這段語句,“在正常情況下”,最終一定會被執行(不管有沒有拋出異常),經常被用在需要釋放資源的情況下。那么在我們的應用在運行中,一定會運行finally代碼塊嗎?其實不是的,有以下幾種情況我們的finally代碼塊是不會運行的。
這也是最好理解的情況,如果代碼流程不進入try代碼塊,則相應的catch和finally代碼塊自然不會執行。
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"); } } }
運行結果為:
enter main block
在進入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"); } }
運行結果為:
enter main block
enter try block
但是呢,如果 System.exit(int) 在try代碼塊異常語句之后, finally 還是會被執行,因為已經沒有機會執行 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"); i = i / i; System.exit(0); } catch (Exception e) { System.out.println("enter catch block"); } finally { System.out.println("enter finally block"); } }
運行結果為:
enter main block
enter try block
enter catch block
enter finally block
在當前線程死亡的情況下,finally里的語句也不會執行,比如干擾中斷,或者程序外部kill該線程,或者是意外中止。
public static void main(String[] args) { int i = 0; System.out.println("enter main block"); try { System.out.println("enter try block"); // 模擬執行任務10s,然后在執行任務過程中殺死該線程 Thread.sleep(10 * 1000); i = i / i; } catch (Exception e) { System.out.println("enter catch block"); } finally { System.out.println("enter finally block"); } }
這里在休眠里,用kill命令,殺死該線程,模擬非正常退出,最后運行結果為:
enter main block
enter try block
這里值得注意的是,我們常常在try語句塊里獲取了一些臨界資源,然后finally語句塊里釋放該資源。此時,如果正常獲得取資源后,程序非正常中斷,則我們并未正常釋放該資源,就會導致資源可能會被無限占用,所以這里要考慮一下其它的解決方法,比如給資源設置一個使用時間等,到期自動收回。
還有其它非正常退出(道理同上,就不演示了),也會導致finally代碼塊不執行,比如物理關閉電源,關閉 CPU等。這些其實在開發生產環境中是常有出現的,比如在開發中,某一臺服務器獲取鎖后,不小心斷電或宕機了(未成功釋放鎖),然后導致別的機器也不能獲得到鎖(如果鎖無時間限制),最終導致出現系統型的問題。完事以后,你們開發也不知道發生了什么事,就把所有服務都重啟了一次,解決了問題,最后說一句:“啊!還是重啟大法好”。
到此,關于“Java中的finally一定會執行嗎”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。