標籤:exception throws throw
Java的異常處理:
Java的異常處理是通過5個關鍵字來實現的:try,catch,throw,throws,finally。Java的線上幫 助中對這幾個關鍵字是這樣解釋的:
Throws: Lists the exceptions a method could throw.
Throws:列出一個方法可拋出的異常。
Throw: Transfers control of the method to the exception handler.
Throw:將方法的控制權傳遞給異常處理器。
Try:Opening exception-handling statement.
Try:開啟異常處理狀態。
Catch:Captures the exception.
Catch:捕捉異常。
Finally:Runs its code before terminating the program.
Finally:結束此程式前運行本代碼。
throws語句
throws總是出現在一個函數頭中,用來標明該成員函數可能拋出的各種異常。對大多數Exception 子類來說,Java 編譯器會強迫你聲明在一個成員函數中拋出的異常的類型。如果異類型是 Error或 RuntimeException,或它們的子類,這個規則不起作用, 因為這在程式的正常 部分中是不期待出現的。 如果你想明確地拋出一個RuntimeException,你必須用 throws語句來聲明它的類型。
throw語句
throw總是出現在函數體中,用來拋出一個異常。程式會在throw語句後立即終止,它後面的 語句執行不到,然後在包含它的所有try塊中(可能在上層調用函數中)從裡向外尋找含有與其匹 配的catch子句的try塊。
try語句
try語句用大括弧{}指定了一段代碼,該段代碼可能會拋棄一個或多個例外。
catch語句
catch語句的參數類似於方法的聲明,包括一個例外類型和一個例外對象。例外類型必 須為Throwable類的子類,它指明了catch語句所處理的例外類型,例外對象則由運行時系統在try 所指定的代碼塊中產生並被捕獲,大括弧中包含對象的處理,其中可以調用對象的方法。
catch語句可以有多個,分別處理不同類的例外。Java運行時系統從上到下分別對每 個catch語句處理的例外類型進行檢測,直到找到類型相匹配的catch語句為止。這裡,類型 匹配指catch所處理的例外類型與產生的例外對象的類型完全一致或者是它的父類,因此, catch語句的排列順序應該是從特殊到一般也可以用一個catch語句處理多個例外類型,這時 它的例外型別參數應該是這多個例外類型的父類,程式設計中要根據具體的情況來選擇catch 語句的例外處理類型。
finally語句
try所限定的代碼中,當拋棄一個例外時,其後的代碼不會被執行。通過finally語句可以指定一 塊代碼。無論try所指定的程式塊中拋棄或不拋棄例外,也無論catch語句的例外類型是否與 所拋棄的例外的類型一致,finally所指定的代碼都要被執行,它提供了統一的出口。通常在 finally語句中可以進行資源的清除工作。如關閉開啟的檔案等。
Throws和Throw的區別:
1.Throws是用來聲明一個方法可能拋出的所有異常資訊,跟在方法後面,將異常往上傳,誰調用 我就交給誰處理;而throw則是指拋出的一個具體的異常類型,用在方法語句中。
2.throws可以單獨使用,但throw不能;throws可以單獨使用,然後再由處理異常的方法捕獲 , throw要麼和try-catch-finally語句配套使用,要麼與throws配套使用。
樣本:
class myException extends Exception //自訂Exception{ String msg; myException(int n) { msg="age can not be positive!"; } public String toString() { return msg; } }class Age{ public void intage(int n) throws myException //throws用在方法後,拋出Exception { if(n<0||n>120) { myException e=new myException(n); throw e; //throw是一個轉向語句,拋出對象執行個體,停止執行後面的代碼 } if(n>=0) { System.out.print("合理的年齡!"); } } public static void main(String args[]) //主方法................................. { int a=-5; try { Age age = new Age(); age.intage(a); //觸發異常 System.out.print("拋出異常後的代碼"); //這段代碼是不會被執行的,程式已經被轉向 } catch (myException e) { System.out.print(e.toString()); } finally {//無論拋不拋異常,無論catch語句的異常類型是否與所拋出的例外的類型一致,finally所指定 //的代碼都要被執行,它提供了統一的出口。 System.out.print("進入finally!"); } }}結果:age can not be positive! 進入finally!
樣本:
void fun()throws IOException,SQLException //{ ... } //調用fun() try { fun(); } catch(IOException e) { ... } catch(SQLException e) { ... }
樣本:
class Math{ public int div(int i,int j) throws Exception{ // 定義除法操作,如果有異常,則交給被 //調用處處理 System.out.println("***** 計算開始 *****") ; int temp = 0 ; // 定義局部變數 try{ temp = i / j ; // 計算,但是此處有可能出現異常 }catch(Exception e){ throw e ; }finally{ // 不管是否有異常,都要執行統一出口 System.out.println("***** 計算結束 *****") ; } return temp ; } }; public class ThrowDemo02{ public static void main(String args[]){ Math m = new Math() ; try{ System.out.println("除法操作:" + m.div(10,0)) ; }catch(Exception e){ System.out.println("異常產生:" + e) ; } } }; 如果有異常輸出:除法操作:***** 計算開始 *****異常產生:...***** 計算結束 *****
異常機制及throw與throws的區別