java自定義異常以及throw和throws關鍵字
java中內建了很多可能在程式設計時出現的大部分異常。除此之外,使用者可以使用一個類繼承Exception類即可繼承自定義類異常。
在程式中自定義類,大體上分為以下幾個步驟:
- 建立自定義異常類
- 在方法中通過throw關鍵字丟擲異常物件。
- 如果在當前丟擲異常的方法中處理異常,可以使用try-catch語句塊捕捉並處理異常,否則在方法的宣告處通過throws指明要丟擲給方法呼叫者的異常,繼續進行下一步操作。
- 再出現異常的方法的呼叫者中捕獲處理異常。
下面是我建立自定義異常。在專案中建立類MyException,該類繼承Exception。
public class MyException extends Exception{ //建立自定義異常 public MyException(String ErrorExceptin){ //構造方法 super(ErrorExceptin); //父類構造方法 } }
在專案中建立類TestException,在該類中建立一個帶int型引數的方法Sum(),該方法引數是否小於0或大於20,通過throw關鍵字丟擲一個MyException異常物件,並在main()中捕獲異常。下面是程式碼例項。
public class TestException { //定義方法,丟擲異常 private static int Sum(int num1,int num2)throws MyException{ if(num1<0||num2<0){ //判斷方法中引數是否滿足條件 throw new MyException("輸入引數為負數"); //錯誤資訊 } if(num1>20||num2>20){ //判斷方法中引數是否滿足條件 throw new MyException("輸入引數大於20");//錯誤資訊 } return (num1+num2); //將兩個數的和輸出 } public static void main(String []args){ try { //try程式碼塊處理可能出現的異常 int result=Sum(22,23); //呼叫Sum()方法 System.out.println(result); //將Sum()方法的返回值輸出 } catch (MyException e) { // TODO: handle exception System.out.println(e); //輸出異常資訊 } } }
輸出結果:
上面說的是如何定義一個自定義異常,那麼接下來說說,如何在方法中丟擲異常呢?
若是某個方法可能發生異常,但不想在當前方法中處理這個異常,則可以使用throws、throw關鍵字在方法中丟擲異常。
throws通常用在宣告方法時,用來制指定可能丟擲的異常。多個異常可以使用逗號分隔。
throw關鍵字通常用於方法體中,並且丟擲一個異常物件。程式在執行到throw語句時立即終止,它後面的語句都不執行。通過throw丟擲異常後,如果想在上一級程式碼中來捕獲並處理異常,則需要在丟擲異常的方法中使用throws關鍵字在方法的宣告中指明要丟擲的異常;如果要捕獲throw丟擲的異常,則必須使用try-catch語句塊;
下面是一個空指標的例子的例子;
public class NullpointExceptionTest {
static void testNull()throws NullPointerException{
String s = null;
if(s==null){
throw new NullPointerException();
}
}
public static void main(String []args){
try {
testNull();
} catch (NullPointerException e) {
// TODO: handle exception
System.out.println("testNull()中丟擲的異常是"+e);
}
}
}
輸出結果:
注意:如果是Error、RuntimeException或它們的子類,可以不使用throws關鍵字來宣告要丟擲的異常,編譯仍能順利通過,但在系統執行時會被系統丟擲。如果有多個catch語句塊處理異常,但是catch(Exception e)程式碼塊放在其他程式碼的前面的畫,後面的程式碼就得不到執行,後面的程式碼塊將得不到執行。
RuntimeException異常是程式執行過程中產生的異常,java類庫的每個包中都定義了異常類,所有這些類都是Throwable的子類。Throwable派生了兩個子類,分別是Exception和Error類。Error類及其子類用來描述java系統中的內部錯誤以及資源耗盡的錯誤,這類錯誤比較嚴重。Exception類被稱為非致命類,可以通過捕捉處理是程式繼續執行。Exception類有根據錯誤發生的原因分為RuntimeException異常和RuntimeException異常之外的異常。這些常見的異常都可以通過try-catch語句來捕捉。
java異常機制使用者去考慮程式的強制性和安全性。異常處理不應用來控制程式的正常流程,其主要作用是捕獲程式在執行時發生的異常並進行相應的處理。編寫程式碼處理某個方法時可能出現的異常時,可遵循以下幾條原則:
- 在當前方法宣告中使用try-catch語句捕獲異常。
- 在一個方法被覆蓋時,覆蓋它的方法必須丟擲相應的異常或者異常的子類。
- 如果父類丟擲多個異常,則覆蓋的方法必須丟擲那些異常的一個子集,不能丟擲新的異常。