一、為什么要自定義異常類
1、為什么要自定義異常類
Java中不同的異常類,分別表示着某一種具體的異常情況,那么在開發中總是有些異常情況是沒有定義好的,此時我們根據自己業務的異常情況來定義異常類。
一些異常都是 Java 內部定義好的,但是實際開發中也會出現很多異常,這些異常很可能在JDK中沒有定義過,例如年齡負數問題,考試成績負數問題,這時就需要我們自定義異常。
2、什么是自定義異常類
在開發中根據自己業務的異常情況來定義異常類。
二、異常類如何自定義
1、如何自定義
① 一般地,用戶自定義異常類都是 RuntimeException 的子類;
② 自定義異常類通常需要編寫幾個重載的構造器;
③ 自定義異常需要提供 serialVersionID;
④ 自定義的異常通過 throw 拋出;
⑤ 自定義異常最重要的是異常類的名字,當異常出現時,可以根據名字判斷異常類型;
2、案例
(1)自定義一個編譯器異常:自定義類 並繼承 java.lang.Exception
(2)自定義一個運行時期的異常類:自定義類,並繼承於 java.lang.RuntimeException。
建議:保留兩種構造器的形式
①無參構造
②帶給父類的message屬性賦值的構造器
語法格式:
public class XXXExcepiton extends Exception | RuntimeException{
添加一個空參數的構造方法
添加一個帶異常信息的構造方法
}
注意:
(1)自定義異常類一般都是以Exception結尾,說明該類是一個異常類
(2)自定義異常類,必須的繼承Exception或者RuntimeException
繼承Exception:那么自定義的異常類就是一個編譯期異常,如果方法內部拋出了編譯期異常,就必須處理這個異常,要么throws,要么try...catch
繼承RuntimeException:那么自定義的異常類就是一個運行期異常,無需處理,交給虛擬機處理(中斷處理)
Demo:
1 public class DemoRegisterException { 2 // 1.使用數組保存已經注冊過的用戶名(數據庫)
3 static String[] usernames = {"張三","李四","王五"}; 4
5 public static void main(String[] args) /*throws RegisterException*/ { 6 //2.使用Scanner獲取用戶輸入的注冊的用戶名(前端,頁面)
7 Scanner sc = new Scanner(System.in); 8 System.out.println("請輸入您要注冊的用戶名:"); 9 String username = sc.next(); 10 checkUsername(username); 11
12 } 13
14 //3.定義一個方法,對用戶輸入的中注冊的用戶名進行判斷
15 public static void checkUsername(String username) /*throws RegisterException*/ { 16 //遍歷存儲已經注冊過用戶名的數組,獲取每一個用戶名
17 for (String name : usernames) { 18 //使用獲取到的用戶名和用戶輸入的用戶名比較
19 if(name.equals(username)){ 20 //true:用戶名已經存在,拋出RegisterException異常,告知用戶"親,該用戶名已經被注冊";
21 try { 22 throw new RegisterException("親,該用戶名已經被注冊"); 23 } catch (RegisterException e) { 24 e.printStackTrace(); 25 return; //結束方法
26 } 27 } 28 } 29
30 //如果循環結束了,還沒有找到重復的用戶名,提示用戶"恭喜您,注冊成功!";
31 System.out.println("恭喜您,注冊成功!"); 32 } 33 } 34
35 // 異常類
36 public class RegisterException extends /*Exception*/ RuntimeException{ 37 //添加一個空參數的構造方法
38 public RegisterException(){ 39 super(); 40 } 41
42 /*
43 添加一個帶異常信息的構造方法 44 查看源碼發現,所有的異常類都會有一個帶異常信息的構造方法,方法內部會調用父類帶異常信息的構造方法,讓父類來處理這個異常信息 45 */
46 public RegisterException(String message){ 47 super(message); 48 } 49 }