日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

CoreJava 笔记总结-第七章 异常,断言和日志

發布時間:2023/12/4 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.out.println("x=" + x); ``Logger.getGlobal().info("x=" + x);``Logger.getGlobal().info("this=" + this);打印或者記錄任意變量的值
  • 每一個類中單獨放置main方法
  • 日志代理:一個子類對象,截獲方法調用,記錄日志,調用超類中的方法.
  • var generator = new Random(){public double nextDouble(){double result = super.nextDouble();Logger.getGlobal().info("nextDouble: " + result);return result;} };System.out.println(generator.nextDouble()); /* 9月 05, 2021 11:48:19 上午 chapter7_exception_assertion_logger.test.log$1 nextDouble 信息: nextDouble: 0.8803807382089267 0.8803807382089267 */
  • 利用Throwable類的printStackTrace方法,可以從任意異常對象獲得堆棧軌跡
  • try{... } catch(Throwable t){t.printStackTrace();throw t; }或者: Thread.dumpStack();
  • 堆棧軌跡一般顯示在System.err上.想要記錄或者顯示堆棧軌跡,可以捕獲進入一個字符串

    import java.io.*;

  • var out = new StringWriter(); new Throwable().printStackTrace(new PrintWriter(out)); String description = out.toString(); //System.out.println(description);

    總結

    以上是生活随笔為你收集整理的CoreJava 笔记总结-第七章 异常,断言和日志的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。