異常處理

1 異常

1.1 異常的概述

異常就是程序出現了不正常的情況,在Java中,異常是一種Exception類型的對象,所以異常也是多態的

1.2 異常處理機制

Java的異常處理(exception-handling)機制能夠將處理異常的代碼放在容易閱讀的位置上,讓程序員可以知曉調用方法的風險性

1.3 異常的體系結構

在這裏插入圖片描述

2 JVM默認處理異常的方式

  • 如果程序出現了問題,我們沒有做任何處理,最終JVM 會做默認的處理,處理方式有如下兩個步驟:
  • 把異常的名稱,錯誤原因及異常出現的位置等信息輸出在了控制檯
  • 程序停止執行

3 try-catch方式處理異常

  • 定義格式

    try {
    	可能出現異常的代碼;
    } catch(異常類名 變量名) {
    	異常的處理代碼;
    }
    
  • 執行流程

    • 程序從 try 裏面的代碼開始執行
    • 出現異常,就會跳轉到對應的 catch 裏面去執行,如果沒有異常,則跳過catch中的部分
    • 執行完畢之後,程序還可以繼續往下執行
  • 示例代碼

    public class ExceptionDemo01 {
        public static void main(String[] args) {
            System.out.println("開始");
            method();
            System.out.println("結束");
        }
    
        public static void method() {
            try {
                int[] arr = {1, 2, 3};
                System.out.println(arr[3]);
                System.out.println("這裏能夠訪問到嗎");
            } catch (ArrayIndexOutOfBoundsException e) {
    //            System.out.println("你訪問的數組索引不存在,請回去修改爲正確的索引");
                e.printStackTrace();
            }
        }
    }
    

如果try/catch結構後又finally,finally中的程序塊是必須執行的,無論是否出現異常

如果有多個catch塊時,要從小到大排(先子後父)

在寫try/catch時要注意以下幾點:

  • catch與finally不能沒有try
  • try一定要有catch或finally
  • try和catch之間不能有其他程序語句
  • 只帶finally的try必須聲明異常

4 Throwable成員方法(應用)

Throwable類是Java中所有錯誤和異常的超類

  • 常用方法

    方法名 說明
    public String getMessage() 返回此 throwable 的詳細消息字符串
    public String toString() 返回此可拋出的簡短描述
    public void printStackTrace() 把異常的錯誤信息輸出在控制檯
  • 示例代碼

    public class ExceptionDemo02 {
        public static void main(String[] args) {
            System.out.println("開始");
            method();
            System.out.println("結束");
        }
    
        public static void method() {
            try {
                int[] arr = {1, 2, 3};
                System.out.println(arr[3]); //new ArrayIndexOutOfBoundsException();
                System.out.println("這裏能夠訪問到嗎");
            } catch (ArrayIndexOutOfBoundsException e) { //new ArrayIndexOutOfBoundsException();
    //            e.printStackTrace();
    
                //public String getMessage():返回此 throwable 的詳細消息字符串
    //            System.out.println(e.getMessage());
                //Index 3 out of bounds for length 3
    
                //public String toString():返回此可拋出的簡短描述
    //            System.out.println(e.toString());
                //java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
    
                //public void printStackTrace():把異常的錯誤信息輸出在控制檯
                e.printStackTrace();
    //            java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
    //            at com.itheima_02.ExceptionDemo02.method(ExceptionDemo02.java:18)
    //            at com.itheima_02.ExceptionDemo02.main(ExceptionDemo02.java:11)
    
            }
        }
    }
    

5 編譯時異常和運行時異常的區別(記憶)

  • 編譯時異常
    • 都是Exception類及其子類
    • 必須顯示處理,否則程序就會發生錯誤,無法通過編譯
  • 運行時異常
    • 都是RuntimeException類及其子類
    • 無需顯示處理,也可以和編譯時異常一樣處理

6 throws方式處理異常(應用)

  • 定義格式

    public void 方法() throws 異常類名 {
        
    }
    
  • 示例代碼

    public class ExceptionDemo {
        public static void main(String[] args) {
            System.out.println("開始");
    //        method();
            try {
                method2();
            }catch (ParseException e) {
                e.printStackTrace();
            }
            System.out.println("結束");
        }
        /*
        如果duck掉異常,相當於踢皮球,未處理異常,即在只throws異常,不使用try/catch
        public static void main(String[] args) throws ParseException, {
            System.out.println("開始");
            method();
            
        }
        */
    
        //編譯時異常
        public static void method2() throws ParseException {
            String s = "2048-08-09";
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date d = sdf.parse(s);
            System.out.println(d);
        }
    
        //運行時異常
        public static void method() throws ArrayIndexOutOfBoundsException {
            int[] arr = {1, 2, 3};
            System.out.println(arr[3]);
        }
    }
    
  • 注意事項

    • 這個throws格式是跟在方法的括號後面的
    • 編譯時異常必須要進行處理,兩種處理方案:try…catch …或者 throws,如果採用 throws 這種方案,將來誰調用誰處理
    • 運行時異常可以不處理,出現問題後,需要我們回來修改代碼

7 throws和throw的區別

在這裏插入圖片描述

8 自定義異常

Ctrl+N輸入NullpointException可以搜索類

異常繼承自Exception或RuntimeException就在異常體系中

  • 自定義異常定義格式:

    public class 異常類名 extends Exception{
    	無參構造
    	帶參構造
    }
    
  • 自定義異常類

    public class ScoreException extends Exception {
    
        public ScoreException() {}
    
        public ScoreException(String message) {
            super(message);
        }
    
    }
    
  • 老師類

    public class Teacher {
        public void checkScore(int score) throws ScoreException {
            if(score<0 || score>100) {
    //            throw new ScoreException();
                throw new ScoreException("你給的分數有誤,分數應該在0-100之間");
            } else {
                System.out.println("成績正常");
            }
        }
    }
    
  • 測試類

    public class Demo {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            System.out.println("請輸入分數:");
    
            int score = sc.nextInt();
    
            Teacher t = new Teacher();
            try {
                t.checkScore(score);
            } catch (ScoreException e) {
                e.printStackTrace();
            }
        }
    }
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章