1.7 Java try catch finally语句
在實際開發(fā)中,根據(jù) try catch 語句的執(zhí)行過程,try 語句塊和 catch 語句塊有可能不被完全執(zhí)行,而有些處理代碼則要求必須執(zhí)行。例如,程序在 try 塊里打開了一些物理資源(如數(shù)據(jù)庫連接、網(wǎng)絡(luò)連接和磁盤文件等),這些物理資源都必須顯式回收。
Java的垃圾回收機制不會回收任何物理資源,垃圾回收機制只回收堆內(nèi)存中對象所占用的內(nèi)存。
所以為了確保一定能回收 try 塊中打開的物理資源,異常處理機制提供了 finally 代碼塊,并且 Java 7 之后提供了自動資源管理(Automatic Resource Management)技術(shù)。
finally 語句可以與前面介紹的 try catch 語句塊匹配使用,語法格式如下:
try {// 可能會發(fā)生異常的語句 } catch(ExceptionType e) {// 處理異常語句 } finally {// 清理代碼塊 }對于以上格式,無論是否發(fā)生異常(除特殊情況外),finally 語句塊中的代碼都會被執(zhí)行。此外,finally 語句也可以和 try 語句匹配使用,其語法格式如下:
try {// 邏輯代碼塊 } finally {// 清理代碼塊 }使用 try-catch-finally 語句時需注意以下幾點:
一般情況下,無論是否有異常拋出,都會執(zhí)行 finally 語句塊中的語句,執(zhí)行流程如圖 1 所示。
圖 1 try catch finally 語句執(zhí)行流程圖
try catch finally 語句塊的執(zhí)行情況可以細分為以下 3 種情況:
- 如果 try 代碼塊中沒有拋出異常,則執(zhí)行完 try 代碼塊之后直接執(zhí)行 finally 代碼塊,然后執(zhí)行 try catch
finally 語句塊之后的語句。 - 如果 try 代碼塊中拋出異常,并被 catch 子句捕捉,那么在拋出異常的地方終止 try 代碼塊的執(zhí)行,轉(zhuǎn)而執(zhí)行相匹配的 catch
代碼塊,之后執(zhí)行 finally 代碼塊。如果 finally 代碼塊中沒有拋出異常,則繼續(xù)執(zhí)行 try catch finally
語句塊之后的語句;如果 finally 代碼塊中拋出異常,則把該異常傳遞給該方法的調(diào)用者。 - 如果 try 代碼塊中拋出的異常沒有被任何 catch 子句捕捉到,那么將直接執(zhí)行 finally
代碼塊中的語句,并把該異常傳遞給該方法的調(diào)用者。
除非在 try 塊、catch 塊中調(diào)用了退出虛擬機的方法System.exit(int status),否則不管在 try 塊或者 catch 塊中執(zhí)行怎樣的代碼,出現(xiàn)怎樣的情況,異常處理的 finally 塊總會執(zhí)行。
通常情況下不在 finally 代碼塊中使用 return 或 throw 等導致方法終止的語句,否則將會導致 try 和 catch 代碼塊中的 return 和 throw 語句失效,
例 1
當 Windows 系統(tǒng)啟動之后,即使不作任何操作,在關(guān)機時都會顯示“謝謝使用”。下面編寫 Java 程序使用 try catch finally 語句這個過程,具體代碼如下:
上述代碼在 main() 方法中使用 try catch finally 語句模擬了系統(tǒng)的使用過程。當系統(tǒng)啟動之后顯示提示語,無論是否運行了程序,或者在運行程序時出現(xiàn)了意外,程序都將執(zhí)行 finally 塊中的語句,即顯示“謝謝使用!”。輸出時的結(jié)果如下所示。
Windows 系統(tǒng)已啟動! 1:記事本 2:計算器 3:瀏覽器 是否運行程序: y 請輸入程序編號: 2 正在運行程序[計算器] 謝謝使用! Windows 系統(tǒng)已啟動! 1:記事本 2:計算器 3:瀏覽器 是否運行程序: y 請輸入程序編號: 5 謝謝使用! java.lang.ArrayIndexOutOfBoundsException: 4at text.text.main(text.java:23) Windows 系統(tǒng)已啟動! 1:記事本 2:計算器 3:瀏覽器 是否運行程序: asdfasd 謝謝使用!總結(jié)
以上是生活随笔為你收集整理的1.7 Java try catch finally语句的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.6 Java项目实战:计算平均成绩
- 下一篇: 1.9 Java 9增强的自动资源管理