異常

  1. 列舉典型的異常
    典型的錯誤Error:
    方法遞歸調用,會發生棧內存溢出錯誤 StackOverflowError
    當不斷得向堆中創建對象時,會出現OutOfMemoryError

Exception 異常
異常是可以捕捉住,然後讓程序恢復運行

Error和Exception有共同的父類 Throwable

  1. 如何處理異常
    2.1 積極處理
    try {
    // 有可能出現異常的代碼
    } catch( 異常類型 ) {
    // 捕獲異常後的代碼
    }

    1. catch能捕捉的異常,要麼精確匹配,要麼用父類型匹配
    2. 可以用多個catch捕獲不同類型的異常
    3. 多個catch塊時,子類的catch塊要寫在前面,父類要寫在後面
    4. 1.7 後一個catch塊中可以有多個平級的異常

    2.2. 消極處理
    語法: 在方法的聲明部分添加 throws 異常類型
    含義: 說明方法在執行時有可能出現的異常
    將異常交給方法的調用者處理
    main 的調用者是jvm,當異常傳給jvm時,程序運行就結束了

  2. 從異常的行爲分類:
    未檢查異常(uncheck)
    RuntimeException或它的子類
    Error和它的子類
    檢查異常(check)
    Throwable
    Exception以及他們的子類
    檢查異常需要強制地配合try-catch或throws一起使用

  3. 主動拋出異常
    throw new 異常對象(); // 只能是Exception或是Error的子類對象

  4. 異常對象的常見方法
    e.getMessage() 獲取異常的信息
    e.printStackTrace() 打印異常的跟蹤信息

  5. 異常的傳播
    以方法調用的反方向進行傳播

  6. 自定義異常
    1) 創建異常類
    class MyException extends Exception{ // 檢查異常
    }
    class MyException extends RuntimeException { // 未檢查異常
    }

  7. 異常使用的經驗
    1) 不要吞掉異常
    2) 與有返回值的方法連用時要注意:

    public class Exception5 {
    public static int test(){
        try {
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            int r = 1/n;
            return r;
        } catch (Exception e ) {
            System.out.println(e.getMessage());
            return -1; // 解決方法1: 在catch也寫一個return返回結果
    //            throw e; // 解決方法2: 把異常重新拋出
        }
    }
    
    public static void main(String[] args) {
        int r = test();
        System.out.println(r);
    }
    }

    3) 重寫方法與異常聲明(throws)
    子類的重寫方法,不能拋出比父類更多的異常(檢查異常)
    子類的重寫方法,可以不拋出異常
    若父類和子類方法throws都是未檢查異常不用遵守上述約定

    4) 建議將檢查異常轉換爲未檢查異常重新拋出

  8. finally
    語法:

    try {
      ...
    } catch(Exception e) {
    
    } finally {
      // 無論出現異常與否,總會被執行的代碼
    }

    如果try catch 以及finally都出現了return語句, 以finally中的return爲準
    如果try 有return, 但finally中對返回的變量做了修改, 不會影響return的結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章