1. 程式人生 > >java自定義異常以及throw和throws關鍵字

java自定義異常以及throw和throws關鍵字

java中內建了很多可能在程式設計時出現的大部分異常。除此之外,使用者可以使用一個類繼承Exception類即可繼承自定義類異常。

在程式中自定義類,大體上分為以下幾個步驟:

  1. 建立自定義異常類
  2. 在方法中通過throw關鍵字丟擲異常物件。
  3. 如果在當前丟擲異常的方法中處理異常,可以使用try-catch語句塊捕捉並處理異常,否則在方法的宣告處通過throws指明要丟擲給方法呼叫者的異常,繼續進行下一步操作。
  4. 再出現異常的方法的呼叫者中捕獲處理異常。

下面是我建立自定義異常。在專案中建立類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異常機制使用者去考慮程式的強制性和安全性。異常處理不應用來控制程式的正常流程,其主要作用是捕獲程式在執行時發生的異常並進行相應的處理。編寫程式碼處理某個方法時可能出現的異常時,可遵循以下幾條原則:

  1. 在當前方法宣告中使用try-catch語句捕獲異常。
  2. 在一個方法被覆蓋時,覆蓋它的方法必須丟擲相應的異常或者異常的子類。
  3. 如果父類丟擲多個異常,則覆蓋的方法必須丟擲那些異常的一個子集,不能丟擲新的異常。