在Java的異常機制中,時常出現五個關鍵字:try , catch , throw , throws , finally。
下面將總結各個關鍵字的用法,以及throw和throws的區別:
(1) try : 該語句需要用大括號{}指定了一段程式碼,該段程式碼可能會拋棄一個或多個Exception。Java 要求try語句後面至少需要有一個catch或者finally 塊。
在Java 7 中,Java開發人員對try語句進行了增強,使它可以支援對資源的自動回收管理,保證資源總是被正確的釋放。具體使用會在後續的博文中分析。
(2) catch : catch語句的引數類似於方法的宣告,包括一個Exception型別和一個Exception物件。Exception型別必須為Throwable類的子類,它指明瞭catch語句所處理的Exception型別;Exception物件則由執行時系統在try所指定的程式碼塊中生成並被捕獲,大括號中包含物件的處理,其中可以呼叫物件的方法。例如:
try{ //此處將丟擲一個異常 ObjectInputStream ois = new ObjectInputStream( new FileInputStream("file.bin")); Object o = ois.readObject(); } //catch 塊對上面丟擲異常的處理。 catch(IOException ioe){ ioe.printStackTrace(); }
注意:① catch語句可以有多個,分別處理不同類的Exception。Java執行時系統從上到下分別對每個catch語句處理的Exception型別進行檢測,直到找到型別相匹配的catch語句為止。
② 型別匹配指catch到的Exception型別與丟擲的Exception物件的型別一致或者是它的父類,因此,catch語句的排列順序應該是從特殊到一般,否則編譯器將會報錯。例如:
try{ //此處將丟擲一個異常 ObjectInputStream ois = new ObjectInputStream( new FileInputStream("file.bin")); Object o = ois.readObject(); } //在這裡IOException是Exception 的子類,所以這裡沒有報錯。 catch(IOException ioe){ ioe.printStackTrace(); } //假如把這個catch塊放到上一個catch塊前,將會報錯。 catch(Exception ex){ ex.printStackTrace(); }
③ 用一個catch語句處理多個例外型別,這時它的例外型別引數應該是這多個例外型別的父類,程式設計中要根據具體的情況來選擇catch語句的例外處理型別。
④ 雖然try塊後面可以有多個catch塊,但是最終只有一個catch塊會被執行,絕不可能有多個catch塊被執行。
(3) throw and throws : 這兩個語句對初學者來說(特別是使用IDE的初學者)來說,很容易混淆。兩者區別如下:
throw:總是出現在函式體中,指程式執行中丟擲的一個具體的異常Exception,丟擲的Exception需要使用者來捕獲處理。
throws:總是出現在一個函式頭中,用來宣告一個方法可能丟擲的所有異常資訊。通常不用顯示地捕獲異常,系統將自動將異常拋給上級方法。
簡單來說:通常在一個方法(類)的宣告處通過throws宣告方法(類)可能丟擲的異常資訊,而在方法(類)內部通過throw宣告一個具體的異常資訊。
(4) finally : finally塊代表總是會執行的程式碼塊。無論try所指定的程式塊中拋不丟擲 Exception,也無論catch語句的是否有匹配try塊丟擲的異常型別,finally所指定的程式碼都要被執行,它提供了統一的出口。因此通常在finally語句中可以進行資源的清除工作。如關閉開啟的檔案等。當然,在遇到某些情況下,finally塊就不會執行。具體請檢視我的另一篇博文。