java中的自定義異常
阿新 • • 發佈:2019-01-26
所謂的自定義異常,也就是自己定義一個類,繼承異常類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); } }