Java Review三十三、異常處理----補充:斷言、日志、調試)

      網友投稿 808 2022-05-30

      文章目錄

      使用斷言

      斷言的概念

      啟用和禁用斷言

      日志

      基本曰志

      高級曰志

      日志記錄說明

      調試技巧

      使用斷言

      斷言(Assertion)是一種調試程序的方式。在Java中,使用assert關鍵字來實現斷言。

      斷言的概念

      假設確信某個屬性符合要求, 并且代碼的執行依賴于這個屬性。例如, 需要計算:

      double y = Math.sqrt(x);

      1

      確信,這里的 X 是一個非負數值。原因是:X 是另外一個計算的結果,而這個結果不可能是負值;或者 X 是一個方法的參數,而這個方法要求它的調用者只能提供一個正整數。

      當然還應當進行檢查, 以避免讓“ 不是一個數” 的數值參與計算操作。

      可以拋出一個異常:

      if (x < 0) throw new 111egalArgumentException("x < 0");

      1

      但是這段代碼會一直保留在程序中, 即使測試完畢也不會自動地刪除。如果在程序中含有大量的這種檢查,程序運行起來會相當慢。

      斷言機制允許在測試期間向代碼中插入一些檢査語句。當代碼發布時,這些插人的檢測語句將會被自動地移走。

      Java 語言引人了關鍵字 assert。這個關鍵字有兩種形式:

      assert 條件;

      1

      assert 條件:表達式;

      1

      這兩種形式都會對條件進行檢測, 如果結果為 false, 則拋出一個 AssertionError 異常。

      在第二種形式中,表達式將被傳人 AssertionError 的構造器, 并轉換成一個消息字符串。

      Java Review(三十三、異常處理----補充:斷言、日志、調試)

      啟用和禁用斷言

      在默認情況下, 斷言被禁用。可以在運行程序時用 -enableassertions 或 -ea 選項啟用:

      java -enableassertions MyApp

      1

      需要注意的是, 在啟用或禁用斷言時不必重新編譯程序。啟用或禁用斷言是類加載器( class loader) 的功能。當斷言被禁用時, 類加載器將跳過斷言代碼, 因此,不會降低程序運行的速度。

      也可以在某個類或整個包中使用斷言, 例如:

      java -ea:MyClass -eaiconi.inycompany.inylib.. , MyApp

      1

      這條命令將開啟 MyClass 類以及在 com.mycompany.mylib 包和它的子包中的所有類的斷言。選項 -ea 將開啟默認包中的所有類的斷言。

      也可以用選項 -disableassertions 或 -da 禁用某個特定類和包的斷言:

      ava -ea:... -da:MyClass MyApp

      1

      日志

      每個 Java 程序員都很熟悉在有問題的代碼中插入一些 System.out.println 方法調用來幫助觀察程序運行的操作過程。 當然, 一旦發現問題的根源, 就要將這些語句從代碼中刪去。如果接下來又出現了問題, 就需要再插入幾個調用 System.out.println方法的語句。

      記錄日志API 就是為了解決這個問題而設計的。

      下面先討論這些 API 的優點。

      可以很容易地取消全部日志記錄,或者僅僅取消某個級別的日志,而且打開和關閉這個操作也很容易。

      可以很簡單地禁止日志記錄的輸出, 因此,將這些日志代碼留在程序中的開銷很小。

      日志記錄可以被定向到不同的處理器, 用于在控制臺中顯示, 用于存儲在文件中等。

      日志記錄器和處理器都可以對記錄進行過濾。過濾器可以根據過濾實現器制定的標準丟棄那些無用的記錄項。

      日志記錄可以采用不同的方式格式化,例如,純文本或 XML。

      應用程序可以使用多個日志記錄器, 它們使用類似包名的這種具有層次結構的名字,例如, com.mycompany.myapp0 ?在默認情況下,日志系統的配置由配置文件控制。如果需要的話, 應用程序可以替換

      這個配置。

      基本曰志

      要生成簡單的日志記錄,可以使用全局日志記錄器(global logger) 并調用其 info 方法:

      Logger.getClobal 0,info("File->Open menu item selected");

      1

      在默認情況下,這條記錄將會顯示以下內容:

      May 10, 2013 10:12:15 PM LogginglmageViewer fileOpen INFO: File->0pen menu item selected

      1

      2

      但是, 如果在適當的地方(如 main 開始)調用

      Logger.getClobal ().setLevel (Level .OFF);

      1

      將會取消所有的日志。

      API:java.util.logging

      高級曰志

      從前面已經看到“ 虛擬日志”,下面繼續看一下企業級( industrial-strength) 日志。在一個專業的應用程序中,不要將所有的日志都記錄到一個全局日志記錄器中,而是可以自定義日志記錄器。

      可以調用 getLogger 方法創建或獲取記錄器:

      private static final Logger myLogger = Logger.getLogger("com.mycompany.myapp"):

      1

      與包名類似,日志記錄器名也具有層次結構。事實上, 與包名相比,日志記錄器的層次性更強。 對于包來說,一個包的名字與其父包的名字之間沒有語義關系,但是日志記錄器的父與子之間將共享某些屬性。例如, 如果對 com.mycompany 日志記錄器設置了日志級別,它的子記錄器也會繼承這個級別 。

      通常, 有以下 7 個日志記錄器級別:

      SEVERE

      WARNING

      INFO

      CONFIG

      FINE

      FINER

      FINEST

      在默認情況下,只記錄前夂個級別。 也可以設置其他的級別。例如:

      logger,setLevel (Level .FINE);

      1

      現在, FINE 和更高級別的記錄都可以記錄下來。

      另外, 還可以使用 Level.ALL 開啟所有級別的記錄, 或者使用 Level.OFF 關閉所有級別的記錄。

      對于所有的級別有下面幾種記錄方法:

      logger.warning(message): logger,fine(message) ;

      1

      2

      同時, 還可以使用 log 方法指定級別, 例如:

      logger.log(Level .FINE, message);

      1

      日志記錄說明

      日志記錄常用的操作:

      1 ) 為一個簡單的應用程序, 選擇一個日志記錄器,并把日志記錄器命名為與主應用程序包一樣的名字,例如,com.mycompany.myprog。

      可以通過調用下列方法得到日志記錄器:

      Logger logger = Logger.getLogger("com.mycompany.myprog");

      1

      為了方便,可以利用一些日志操作將下面的靜態域添加到類中:

      private static final Logger logger = Logger.getLogger("com.mycompany.nyprog"):

      1

      2 ) 默認的日志配置將級別等于或高于 INFO 級別的所有消息記錄到控制臺。用戶可以覆蓋默認的配置文件。但是正如前面所述,改變配置需要做相當多的工作。因此,最好在應用程序中安裝一個更加適宜的默認配置。

      下列代碼確保將所有的消息記錄到應用程序特定的文件中。可以將這段代碼放置在應用程序的 main方法中。

      if (System,getProperty("java,util.logging.config.dass") == null && System.getPropertyC'java.util.logging.config.file") == null) { try { Logger.getLogger("").setLevel(Level.ALL); final int L0C_R0TATI0N_C0UNT = 10; Handler handler = new FileHandler('Wmyapp.log", 0, L0G_R0TATI0N_C0UNT): Logger.getLogger("").addHandler(handler): } catch (IOException e) { logger.log(Level.SEVERE, "Can't create log file handler", e); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      3 ) 現在,可以記錄自己想要的內容了。但需要注意:所有級別為 INFO、 WARNING 和SEVERE 的消息都將顯示到控制臺上。因此, 最好只將對程序用戶有意義的消息設置為這幾個級別。將程序員想要的日志記錄,設定為 FINE 是一個很好的選擇。

      當調用 System.out.println 時, 實際上生成了下面的日志消息:

      logger.fine("File open dialog canceled";

      1

      記錄那些不可預料的異常也,例如:

      try {} catch (SonreException e) { logger,log(Level.FINE, "explanation", e); }

      1

      2

      3

      4

      5

      調試技巧

      在Intellij IDEA中使用Debug

      how2j.java:如何在Eclipse中調試Java程序

      W3Cschool:jUnit教程

      Spring Boot干貨系列:(十二)Spring Boot使用單元測試

      參考:

      【1】:《Java核心技術 卷一》

      【2】:廖雪峰的官方網站:使用斷言

      【3】:廖雪峰的官方網站:使用JDK Logging

      【4】:廖雪峰的官方網站:使用Commons Logging

      【5】:廖雪峰的官方網站:使用Log4j

      【6】:廖雪峰的官方網站:使用SLF4J和Logback

      【7】:how2j.java: Log4j系列教材

      Java 網站

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:一文快速掌握華為云IPv6基礎知識及使用指南
      下一篇:《機器學習:算法視角(原書第2版)》 —3.3 感知器
      相關文章
      亚洲AV无码一区二区三区牲色| 亚洲国产成人精品无码区二本 | 精品亚洲成α人无码成α在线观看 | 久久久久se色偷偷亚洲精品av| 2022中文字字幕久亚洲| 亚洲国产欧美一区二区三区| 亚洲黄色在线网站| 国产成人麻豆亚洲综合无码精品 | 亚洲人成无码久久电影网站| 亚洲а∨天堂久久精品9966| 精品亚洲成a人片在线观看| 亚洲伦另类中文字幕| 久久精品亚洲中文字幕无码麻豆 | 亚洲人成网站色7799| 亚洲国产成a人v在线| 亚洲乱码无码永久不卡在线| 亚洲国产成人久久精品软件 | 久久久久亚洲精品无码网址色欲| 亚洲国产欧美国产综合一区| 亚洲黄色激情视频| 亚洲第一成年网站大全亚洲| 亚洲成AV人片在线播放无码| 亚洲国产一区在线| 久久精品国产亚洲av麻豆 | 亚洲三区在线观看无套内射| 亚洲精品一品区二品区三品区| 亚洲AV无码一区二三区 | 日韩亚洲欧洲在线com91tv| 亚洲熟女乱综合一区二区| 国产AV无码专区亚洲AV手机麻豆 | 亚洲AV无码不卡在线观看下载| 亚洲国产成人精品无码久久久久久综合| 亚洲国产主播精品极品网红| 亚洲AV无码专区在线厂| 日本中文一区二区三区亚洲 | 亚洲AV无码第一区二区三区 | 亚洲妓女综合网99| 久久久久久亚洲精品中文字幕 | 亚洲第一成年免费网站| 亚洲av日韩av综合| 亚洲综合在线成人一区|