1. 程式人生 > >java中的自定義異常

java中的自定義異常

       所謂的自定義異常,也就是自己定義一個類,繼承異常類RuntimeException, 經常需要定義一個或多個建構函式,以在物件中儲存錯誤訊息。


/*
ExceptionDemo4.java中的異常,不好認,能不能定義一個符合我的程式要求的問題名稱。

異常的資訊都可以自定義,那麼異常的名字是否可以定義呢?是否可以定義成更符合自己程式的閱讀呢?

之前的幾個異常都是java通過類進行的描述。並將問題封裝成物件,這是符合面向物件思想。
其實:異常就是將問題封裝成了物件。

所以我也準備對自己所需要的問題進行類的描述。


發生編譯失敗:
ExceptionDemo5.java:43: 錯誤: 不相容的型別
                        throw new NoAgeException(age+",年齡數值非法");
                              ^
  需要: Throwable
  找到:    NoAgeException
1 個錯誤

不相容,不明白,查閱,提示中說需要Throwable,啥東西?
搜尋API。看到Throwable描述。發現。它是異常和錯誤的超類(父類)
原來它是異常體系的頂層類。
Throwable
	|--Error
	|--Exception


通過閱讀:自定義異常被丟擲,必須是繼承Throwable,或者繼承Throwable的子類。
該物件才可以被throw丟擲。

原來這個異常體系具備一個特有的特性:可拋性:可以被throw關鍵字操作。

繼承選擇父類時,更為確切是繼承Exception。
但是發現編譯又一次失敗了。

ExceptionDemo5.java:62: 錯誤: 未報告的異常錯誤NoAgeException; 必須對其進行捕獲或
宣告以便丟擲
                        throw new NoAgeException(age+",年齡數值非法");
                        ^
1 個錯誤

通過這個編譯失敗提示,發現自定義的異常和之前所使用的異常(空指標異常,角標越界異常,無效引數異常有不同)
丟擲哪些異常沒有這個失敗提示?那麼之前的異常和自定義的異常有什麼區別呢?
通過檢視api的繼承體系發現,之前的異常都是Exception下面的RuntimeException子類的子類。
閱讀RuntimeException描述中有明確說明,這個執行時異常以及其子類都無需進行宣告。

可以將自定義的異常繼承RuntimeException.

*/
//自定義異常。描述Person的年齡數值非法。
/**
只要是本專案的Person的年齡出現非法值就會發生該異常。
*/
class NoAgeException extends RuntimeException
{
	/*
	為什麼要定義建構函式,因為看到Java中的異常描述類中有提供對問題物件的初始化方法。
	*/
	NoAgeException()
	{
		super();
	}

	NoAgeException(String message)
	{
		super(message);// 如果自定義異常需要異常資訊,可以通過呼叫父類的帶有字串引數的建構函式即可。
	}
}

class Person
{
	private String name;
	private int age;
	Person(String name,int age)
	{
		//加入邏輯判斷。
		if(age<0 || age>200)
		{
			throw new NoAgeException(age+",年齡數值非法");
		}
		this.name = name;
		this.age = age;
	}
	//定義Person物件對應的字串表現形式。覆蓋Object中的toString方法。
	public String toString()
	{
		return "Person[name="+name+",age="+age+"]";
	}
}



class ExceptionDemo5 
{
	public static void main(String[] args) 
	{
		Person p = new Person("xiaoming",-20);
		System.out.println(p);
	}
}
執行結果為: