CoreJava 笔记总结-第七章 异常,断言和日志
文章目錄
- 第七章 異常,斷言和日志
- 處理錯誤
- 異常的分類
- 聲明檢查型異常
- 如何拋出異常
- 創建異常類
- 捕獲異常
- 捕獲單個異常
- 捕獲多個異常
- 再次拋出異常和異常鏈
- `finally`子句
- `try-with-Resource`語句
- 分析堆棧軌跡元素
- 使用異常的技巧
- 使用斷言
- 使用斷言完成參數檢查
- 日志
- 基本日志
- 高級日志
- 調試技巧
第七章 異常,斷言和日志
處理錯誤
異常的分類
- 異常對象都是派生于Throwable類的一個類實例
- 下一層:Error:描述java運行時系統內部錯誤或者資源耗盡錯誤 Exception: 其他異常(IOException), RuntimeException(編程錯誤導致的異常)
- RuntimeException: 錯誤的強制類型轉換,數組訪問越界,訪問null指針
- 非檢查型異常: Error, RuntimeException, 其他的異常稱為檢查型異常
聲明檢查型異常
- 一個方法必須聲明所有可能拋出的檢查型異常,而非檢查型異常:Error在控制之外, RuntimeException一開始就應該避免的情況
- 子類中覆蓋了超類的一個方法,子類中聲明的檢查型異常必須特殊性大于等于超類中的(不拋出或者拋出更加特殊的異常)
如何拋出異常
-
方法: 找到一個合適的異常類–>創建這個類的一個對象–>將對象拋出
-
throw new EDFException
- var e = new EDFException(); throw e;
-
throw new EOFException(string)
創建異常類
-
定義一個派生于Exception的類或者其子類,包含兩個構造器:默認構造器和一個包含詳細描述信息的構造器
- class FileFormatException extends IOException {public FileFormatException(){}public FileFormatException(Strig gripe){super(gripe);} }
捕獲異常
捕獲單個異常
- try{codemore code } catch(ExceptionType e){handle for this type }
-
捕獲知道怎么處理的異常, 傳播不知道如何處理的異常
- public void read(String filename){try{var in = new FileInputStream(filename);int b;while((b = in.read())!= -1){...}}catch(IOException exception){exception.printStackTrace();} }public void read(String filename) throws IOException {var in = new FileInputStream(filename);int b;while((b = in.read())!= -1){...} }
-
子類方法覆蓋超類,超類沒有拋出異常,子類必須捕獲
捕獲多個異常
- try{codemore code } catch(FileNotFoundException e){emergency action for missing files } catch(UnknowHostException e){emergency action for unknow hosts } catch(IOException | ExceotionType e){emergency action for all i/o problems }
-
e.getMessage()獲取錯誤信息
-
e.getClass().getName()獲得異常對象實際類型
再次拋出異常和異常鏈
- 將原始異常設置為新異常的原因
- 子系統中拋出高層異常,而不會丟失原始異常的細節
- 可以將檢查型異常包裝為非檢查型異常
finally子句
- try{.. } catch{... } finally{... }
-
finally子句中的代碼一定會執行,可以沒有catch子句
-
不要把改變控制流的語句return , throw, continue, break放在finally子句中
try-with-Resource語句
- try(Resource res= . . .){work with res
}
try塊自動退出時,自動調用res,close()
分析堆棧軌跡元素
- package chapter7_exception_assertion_logger.stackTrace;import java.util.Scanner;public class StackTraceTest {//階乘public static int factorial(int n) {System.out.println("factorial(" + n + "):");var walker = StackWalker.getInstance();walker.forEach(System.out::println);int r;if (n <= 1) {r = 1;} else {r = n * factorial(n - 1);}System.out.println("return " + r);return r;}public static void main(String[] args) {try (var in = new Scanner(System.in)){System.out.println("Enter n: ");int n = in.nextInt();factorial(n);}} }
使用異常的技巧
使用斷言
- 斷言:允許在測試期間在代碼中插入一些檢查,而在生產代碼中會自動刪除這些檢查
- assert condition;
- assert condition: expression;
使用斷言完成參數檢查
-
斷言使用規則: 斷言失敗是致命的,不可恢復的錯誤; 斷言只是在開法和測試階段打開
- assert a!= null;
-
3種處理系統錯誤的機制: 拋出異常,斷言,日志
日志
基本日志
-
生成簡單的日志,使用全局日志記錄器Logger.getGlobal().info("File->Open menu item selected");
9月 05, 2021 11:24:59 上午 chapter7_exception_assertion_logger.test.log main 信息: File->Open menu item selected.
-
Logger.getGlobal().setLevel(Level.OFF)將會取消所有的日志
高級日志
- P306
調試技巧
堆棧軌跡一般顯示在System.err上.想要記錄或者顯示堆棧軌跡,可以捕獲進入一個字符串
import java.io.*;
總結
以上是生活随笔為你收集整理的CoreJava 笔记总结-第七章 异常,断言和日志的全部內容,希望文章能夠幫你解決所遇到的問題。