1. 程式人生 > >寫給java小白學習之路--異常

寫給java小白學習之路--異常

2-0異常體系結構:

 

 

 

2-1:定義:

程式在執行期間發生的不正常的情況稱之為異常。

2-2jvm解決異常的方式:

  1、終止正在執行程式

2、輸出當前異常資訊

a、異常的型別 (jdk內部維護了當前異常的一個物件 用當前物件來描述當前出現的異常)

b、異常的原因

c、異常可能出現的行數

 

2-3:程式出現異常列子:

1. 

package com.shsxt.exception;  

2.   

3. import java.util.Scanner;  

4.   

5. /* 

6.  * 使用者輸入兩個數 求兩個數的商 

7.  *  java.util.InputMismatchException     

8. 

 *  

9.  *  

10.  */  

11. public class Test02 {  

12.       

13.     public static void main(String[] args) {  

14. 

          

15.           

16.         Scanner input = new Scanner(System.in);  

17.         System.out.println("請輸入被除數---->");  

18.         int num1 = input.nextInt();  

19.         System.out.println("請輸入除數---->");  

20.           

21.         //關閉當前的Scanner  

22.         input.close();  

23.           

24.           

25.         int num2 = input.nextInt();  

26.         System.out.println(num1+"/"+num2+"="+(num1/num2));            

27.     }  

28. }  

 

報錯資訊:

 

 

2-4:通過業務邏輯解決異常的方式:

1. package com.shsxt.exception;  

2.   

3. import java.util.Scanner;  

4.   

5. /* 

6.  * 手動解決異常問題 

7.  *       

8.  *   通過大量的if判斷解決程式在執行過程中可能出現的異常情況。 

9.  *   優勢:確實可以將異常資訊不交由jvm解決  顯示更友好的提示資訊 

10.  *   劣勢:編寫的程式碼量太大了 而且後期不利於維護 並且程式設計師永遠不知道使用者有哪些輸入    

11.  *    

12.  *    

13.  *  

14.  *  

15.  */  

16. public class Test03 {  

17.     public static void main(String[] args) {  

18.           

19.         Scanner input = new Scanner(System.in);  

20.         System.out.println("請輸入被除數---->");  

21.           

22.         //判定一次使用者輸入的值是不是我們需要的  

23.         if(input.hasNextInt()){//下一次獲取到的值是否是一個int 如果是返回true 如果不是返回fasle  

24.             int num1 = input.nextInt();  

25.             System.out.println("請輸入除數---->");  

26.             //判定使用者輸入  

27.             if(input.hasNextInt()){  

28.                 int num2 = input.nextInt();  

29.                 if(num2!=0){  

30.                     System.out.println(num1+"/"+num2+"="+(num1/num2));  

31.                 }else{  

32.                     System.out.println("除數不能為0");  

33.                 }  

34.             }else{  

35.                 System.out.println("使用者輸入除數有誤");  

36.             }  

37.         }else{  

38.             System.out.println("使用者輸入逇被除數有誤");  

39.         }  

40.      }  

41. }  

 

PS:注意:

1.   通過大量的if判斷解決程式在執行過程中可能出現的異常情況。 

2.  *   優勢:確實可以將異常資訊不交由jvm解決  顯示更友好的提示資訊 

 *   劣勢:編寫的程式碼量太大了 而且後期不利於維護 並且程式設計師永遠不知道使用者有哪些輸入  

 

2-5:異常處理方式 try-catch-finally

2-4-1try-catch

結構:

*  結構:

 * try{

 * 可能出現異常de程式碼段

 * }catch(可能出現的異常){

 * 解決辦法

 * }

 

順序:

*  try-catch的執行順序:

 *   1、執行try塊中的程式碼塊  如果出現異常

 *    2、通過出現的異常去匹配 catch中宣告的異常型別

 *    3、如果匹配成功 執行catch中的程式碼塊         如果匹配失敗  jvm處理當前異常資訊 (終止程式 輸出異常資訊)

 *    4、繼續執行剩下的程式碼

 

例子:

1. public class Test04 {  

2.     public static void main(String[] args) {  

3.         try{  

4.             int num = 1/0;//new ArithmeticException()  

5.             System.out.println(num);  

6.         }catch(InputMismatchException e){ //InputMismatchException e = new ArithmeticException();  

7.             System.out.println("除數不能為0");  

8.         }  

9.           

10.         System.out.println("嘿嘿");  

11.           

12.     }  

13. }  

 

注意事項

PS:只能處理一種異常資訊。

 

2-4-2try-多重catch

結構:

*  結構:

 *   try{

 *   可能出現異常的程式碼

 *   }catch(異常型別1 e1){

 *   解決方案1

 *   }catch(異常型別2 e2){

 *   解決方案2

 *   }catch(異常型別3 e3){

 *   解決方案3

 *   }。。。。{

 *   }

 

順序

* 執行順序:

 * 1、執行try塊 如果出現異常

 * 2、以此匹配多重catch中宣告的異常

 * 3、如果匹配成功 執行當前匹配成功的catchtry-catch塊執行完畢 繼續執行下面的程式碼

 * 4、如果匹配失敗 交由jvm處理 程式終止 輸出異常資訊

 * 5、一般情況下我們都會在最後一個catch中加入Exception 獲取可能沒有捕獲的異常資訊

 

例子

1. public class Test05 {  

2.     public static void main(String[] args) {  

3.           

4.         Scanner input = new Scanner(System.in);  

5.           

6.         try{  

7.             System.out.println("請輸入被除數---->");  

8.             int num1 = input.nextInt();  

9.             System.out.println("請輸入除數---->");  

10.             int num2 = input.nextInt();  

11.             System.out.println(num1+"/"+num2+"="+(num1/num2));  

12.               

13.         }catch(InputMismatchException e){//這個異常物件中沒有維護異常的原因 所以通過getMessage獲取不到異常資訊  null  

14.             //e.printStackTrace();   

15.             System.out.println(e.getMessage());  

16.             System.out.println("使用者輸入有誤");  

17.         }catch(ArithmeticException e){//這個異常物件中維護異常的原因 所以通過getMessage可以獲取到異常資訊  

18.             System.out.println(e.getMessage());//by zero  

19.             System.out.println("除數不能為0");  

20.               

21.               

22.         }catch(Exception e){//Exception e = new 可能出現的異常();   父類變數指向了子類物件   

23.             //多型  

24.             System.out.println(e.getMessage());  

25.             System.out.println("外星人把頁面叼走了 請等待。。。");  

26.         }  

27.           

28.     }  

29. }  

 

 

注意事項:

PS:

1、 一般情況下我們都會在最後一個catch中加入Exception 獲取可能沒有捕獲的異常資訊

2、 常見的異常的物件中的方法:

* 異常中常見的方法:

      * e.getMessage() -->獲取異常的原因藐視

      * e.printStackTrace()  -->列印異常的出現行數以及異常的全限定名* e.toString  --> 異常的全限定名

 

2-4-3:try-多重catch-finally

結構:

* 結構:

 * try{

 *   可能出現異常的程式碼

 *   }catch(異常型別1 e1){

 *   解決方案1

 *   }catch(異常型別2 e2){

 *   解決方案2

 *   }catch(異常型別3 e3){

 *   解決方案3

 *   }。。。。{

 *   }finally{

 *   程式碼塊

 *   }

 

順序:

* 執行順序:

 * 1、執行try塊 如果出現異常

 * 2、以此匹配多重catch中宣告的異常

 * 3、如果匹配成功 執行當前匹配成功的catch塊  執行finally程式碼塊 try-catch-finally塊執行完畢 繼續執行下面的程式碼

 * 4、如果匹配失敗 交由jvm處理 程式終止 輸出異常資訊 也會執行finally程式碼塊

 * 5、一般情況下我們都會在最後一個catch中加入Exception 獲取可能沒有捕獲的異常資訊

 * 6、一般情況下通過finally去關閉連線資源

 

例子:

1. public class Test06 {  

2.     public static void main(String[] args) {  

3.         Scanner input  = null;  

4.         try{  

5.               

6.             input = new Scanner(System.in);  

7.             System.out.println("請輸入被除數---->");  

8.             int num1 = input.nextInt();  

9.             System.out.println("請輸入除數---->");  

10.             int num2 = input.nextInt();  

11.             System.exit(0);//關閉虛擬機器 0正常退出  強制退出  

12.             System.out.println(num1+"/"+num2+"="+(num1/num2));  

13.               

14.         }catch(InputMismatchException e){  

15.             System.out.println("使用者輸入有誤");  

16.         }catch(ArithmeticException e){  

17.             System.out.println("除數不能為0");  

18.         }catch(Exception e){  

19.             System.out.println("外星人把頁面叼走了 請等待。。。");  

20.         }finally{  

21.               

22.             System.out.println("我被執行了");  

23.             //在這裡關閉的  

24.             input.close();  

25.         }  

26.           

27.     }  

28. } &nb