天天看點

自定義異常的實作和測試以及異常的注意事項

/*

* java不可能對所有的情況都考慮到,是以,在實際的開發中,我們可能需要自定義異常類。

* 而我們自己随意的寫一個類,是不能作為自定義異常類來看待的,要想你的類能是一個自定義的異常類,就必須繼承自Exception類或者RuntimeException類。

*

* 兩種方式:

*    A:自定義異常類繼承自Exception類         需要檢查編譯期異常和運作期異常

*    B:自定義異常類繼承自RuntimeException類     隻需要檢查運作期異常

*/

示例代碼如下:

自定義異常的實作和測試以及異常的注意事項
自定義異常的實作和測試以及異常的注意事項

1 package cn.itcast_08;
 2 
 3 /*
 4  * java不可能對所有的情況都考慮到,是以,在實際的開發中,我們可能需要自定義異常類。
 5  * 而我們自己随意的寫一個類,是不能作為自定義異常類來看待的,要想你的類能是一個自定義的異常類,就必須繼承自Exception類或者RuntimeException類。
 6  * 
 7  * 兩種方式:
 8  *         A:自定義異常類繼承自Exception類                需要檢查編譯期異常和運作期異常
 9  *         B:自定義異常類繼承自RuntimeException類        隻需要檢查運作期異常
10  */
11 
12 // 自定義異常類繼承自Exception類
13 //public class MyException extends Exception {
14 //    public MyException() {
15 //        super();
16 //    }
17 //
18 //    public MyException(String message) {
19 //        super(message);
20 //    }
21 //}
22 
23 // 自定義異常類繼承自RuntimeException類
24  public class MyException extends RuntimeException {
25     public MyException() {
26         super();
27     }
28 
29     public MyException(String message) {
30         super(message);
31     }
32  }      

自定義異常類

自定義異常的實作和測試以及異常的注意事項
自定義異常的實作和測試以及異常的注意事項
1 package cn.itcast_08;
 2 
 3 public class Teacher {
 4     // 針對MyException繼承自Exception類
 5 //    public void check(int score) throws MyException {
 6 //        if (score > 100 || score < 0) {
 7 //            throw new MyException("分數必須在0-100之間"); // 編譯期異常
 8 //        } else {
 9 //            System.out.println("分數沒有問題");
10 //        }
11 //    }
12 
13     // 針對MyException繼承自RuntimeException類
14     public void check(int score) {
15         if (score > 100 || score < 0) {
16             throw new MyException("分數必須在0-100之間"); // 運作期異常
17         } else {
18             System.out.println("分數沒有問題");
19         }
20     }
21     
22 }      

Teacher.java

自定義異常的實作和測試以及異常的注意事項
自定義異常的實作和測試以及異常的注意事項
1 package cn.itcast_08;
 2 
 3 import java.util.Scanner;
 4 
 5 /*
 6  * 自定義異常的測試類
 7  */
 8 public class StudentDemo {
 9     public static void main(String[] args) {
10         Scanner sc = new Scanner(System.in);
11         System.out.println("請輸入學生成績:");
12         int score = sc.nextInt();
13 
14         Teacher t = new Teacher();
15         
16         // 編譯期異常測試
17 //        try {
18 //            t.check(score);
19 //        } catch (MyException e) {
20 //            e.printStackTrace();
21 //        }
22         
23         // 運作期異常測試
24         t.check(score);
25     }
26 }      

自定義異常的測試類

* 異常的注意事項:

*    A:子類重寫父類方法時,子類的方法必須抛出相同的異常或父類異常的子類。(父親壞了,兒子不能比父親更壞)

*    B:如果父類抛出了多個異常,子類重寫父類時,隻能抛出相同的異常或者是父類異常的子集,子類不能抛出父類沒有的異常。

*    C:如果被重寫的方法沒有異常抛出,那麼子類的方法絕對不可以抛出異常,如果子類方法内有異常發生,那麼子類隻能try,不能throws。

1 package cn.itcast_09;
 2 
 3 import java.text.ParseException;
 4 import java.text.SimpleDateFormat;
 5 import java.util.Date;
 6 
 7 /*
 8  * 異常的注意事項:
 9  *         A:子類重寫父類方法時,子類的方法必須抛出相同的異常或父類異常的子類。(父親壞了,兒子不能比父親更壞)
10  *         B:如果父類抛出了多個異常,子類重寫父類時,隻能抛出相同的異常或者是父類異常的子集,子類不能抛出父類沒有的異常。
11  *         C:如果被重寫的方法沒有異常抛出,那麼子類的方法絕對不可以抛出異常,如果子類方法内有異常發生,那麼子類隻能try,不能throws。
12  */
13 public class ExceptionDemo {
14 
15 }
16 
17 class Fu {
18     public void show() throws Exception {
19     }
20 
21     public void method() {
22     }
23 }
24 
25 class Zi extends Fu {
26     @Override
27     public void show() throws ArithmeticException {
28 
29     }
30 
31     @Override
32     public void method() {
33         String s = "2014-11-20";
34         SimpleDateFormat sdf = new SimpleDateFormat();
35         Date d = null; // 局部變量,引用資料類型,需要初始化為null。為什麼呢?按理說 d = sdf.parse(s); 這一句就可以初始化了啊?
36         try {    
37             d = sdf.parse(s); // 編譯期異常,因為編譯的時候,我不知道try裡面有什麼語句(編譯隻檢查文法),隻有運作的時候才知道try裡面有什麼,如果這句前面有一句抛出異常,則就不會執行到這一句了。d就不能初始化了。
38         } catch (ParseException e) {
39             e.printStackTrace();
40         }
41         
42         System.out.println(d);
43     }
44 }      

我的GitHub位址:

https://github.com/heizemingjun

我的部落格園位址:

http://www.cnblogs.com/chenmingjun

我的螞蟻筆記部落格位址:

http://blog.leanote.com/chenmingjun

Copyright ©2018 黑澤明軍

【轉載文章務必保留出處和署名,謝謝!】