我們都知道,在try…catch…finally語句中,finally作為異常處理的一部分,它緊緊地跟在try…catch語句后,且附帶一個語句塊,表示這段語句。
那么,在“正常”情況下,finally最終一定會被執(zhí)行,不管有沒有拋出異常,而且經(jīng)常被用在需要釋放資源的情況下。
那程序在運行過程中,一定會運行finally代碼塊嗎?其實并不一定,以下幾種情況中的finally語句塊中的代碼是不會運行的。
(1) try語句沒有被執(zhí)行到,如果在try語句之前return語句就返回了,此時finally語句就不會執(zhí)行。這也說明了finally語句被執(zhí)行的必要而非充分條件是相應(yīng)的try語句一定被執(zhí)行到。
(2) 如果一個線程在執(zhí)行try語句塊或者catch語句塊時被打斷(interrupted)或者被終止(killed),與其相對應(yīng)的finally語句塊可能不會執(zhí)行。
(3) 在try塊或者catch塊中有System.exit(0);這樣的語句。System.exit(0)是終止Java虛擬機(JVM)的,JVM都停止了,自然所有的程序就都結(jié)束了,當(dāng)然finally語句也就不會被執(zhí)行了。還有更極端的情況,比如:突然死機或者斷電等等。
(4) 如果finally語句是在守護線程里面,當(dāng)其他線程都執(zhí)行完的時候,守護線程需要立即停止,退出虛擬機,此時finally語句也有可能沒有執(zhí)行到。
(5) 在try…catch…finally語句中,當(dāng)return語句遇到finally語句時,return語句對finally語句無效,也就是說,在try塊或者catch塊里有return語句時,finally語句會被執(zhí)行,finally語句塊里的return語句會把try塊或者catch塊里的return語句效果給覆蓋掉。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導(dǎo)課程