寫給java小白學習之路--異常
2-0異常體系結構:
|
2-1:定義:
程式在執行期間發生的不正常的情況稱之為異常。
2-2:jvm解決異常的方式:
1、終止正在執行程式 2、輸出當前異常資訊 a、異常的型別 (jdk內部維護了當前異常的一個物件 用當前物件來描述當前出現的異常) b、異常的原因 c、異常可能出現的行數 |
2-3:程式出現異常列子:
1. 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-1:try-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-2:try-多重catch
結構:
* 結構: * try{ * 可能出現異常的程式碼 * }catch(異常型別1 e1){ * 解決方案1 * }catch(異常型別2 e2){ * 解決方案2 * }catch(異常型別3 e3){ * 解決方案3 * }。。。。{ * } |
順序
* 執行順序: * 1、執行try塊 如果出現異常 * 2、以此匹配多重catch中宣告的異常 * 3、如果匹配成功 執行當前匹配成功的catch塊 try-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正常退出 非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 |