Java異常處理之finally的使用總結

2021-08-20 12:23:58 字數 1961 閱讀 3908

1.語法

完全體的異常捕獲處理機制包括try...catch...finally三個模組,語法結構如下:

trycatch(exception e)finally
2.特點

finally在使用時有以下特點。

a.在異常處理時,無論是否發生異常或try/catch中出現return語句,finally中的語句都會被執行

b.finally必須使用在所有catch的最後位置,常用來處理一些後續的工作,如釋放資源

考慮一種情況,讀取乙個檔案,並將內容輸出到另乙個檔案中。

fileinputstream in = new fileinputstream(new file("九陰真經.txt"));

fileoutputstream out = new fileoutputstream(new file("九陽真經.txt"));

while((length = in.read(buf)) != -1)

in.close();

out.close();

正常情況下,讀取完檔案並輸出後,需要關閉檔案流。上述**看似使用完後,已經關閉了資源,但是如果在關閉資源前發生異常。那麼檔案資源就一直被占用,將造成資源浪費,嚴重的話可能導致記憶體溢位等異常。因此就需要一種方法,使得程式在異常和正常時都能釋放所占有的資源。這就是finally的價值所在。

在**異常處理語句try...catch...finally中的**執行順序之前,首先記住一條規則:

根據jvm規範,try/catch、finally的return返回值會暫存在乙個區域性變數中。

1.try、catch中沒有return語句

當try和catch中都沒有return語句時,執行順序依次為:

(1)try語句塊開始 ——>(2) 語句塊異常處 ——>(3) catch語句塊 ——> (4) finally語句塊

2.try、catch中有return語句,finally中沒有return。

先把try或catch中return值儲存在區域性變數中,再去執行finally中的語句,最後返回區域性變數中的值。

3.try、catch中有return語句,且finally中也有return

按照2中的順序執行程式,最後finally中return會覆蓋區域性變數中try或catch的return值。

1 public class test 

5 public static string test1() catch(exception e)finally

17 }

18 public static string test2()

22 }

上述**的結果為:

try block

catch block

return statement

finally block

finally

分析:

程式執行try中**並輸出"try block",直到行8處發生異常並**獲;接著執行catch語句塊,輸出「catch block」,在行12處return進入test2()方法;執行test()輸出「return statement」;在20處return結束test2方法並將"after return"返回到12處,catch塊結束,return的值為"after return"暫存起來。接著執行finally塊,輸出"finally block",到15行處return返回值被覆蓋為"finally";最後返回到main方法的3行處,輸出return結果"finally"。

Java面試之異常處理

編譯時異常 也叫強制性異常 也叫checkedexception 和執行時異常 也叫非強制性異常 也叫 runtimeexception.當前方法指導如何處理該異常,則用try.catch 塊來處理該異常.當前方法不知道如何處理,則在定義該方法是宣告丟擲異常.error類和 exception 類的...

java中的return作用 finally

學了好久都沒有搞清楚return的作用,今天上網查了下,自己理解用了下,明白了些 return return的常用作用有以下兩種 一種是返回引數所用的關鍵字,假如乙個有返回值的方法執行完了之後需要返回乙個引數,示例 public string functiontest 那麼這個方法被呼叫之後就會返回...

java之異常處理機制

class myexception extends exception myexception string msg,int id void method throws myexception public class testexception catch arithmeticexception ...