java断言——Assertion
生活随笔
收集整理的這篇文章主要介紹了
java断言——Assertion
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【0】README
0.1) 本文描述+源代碼均 轉自 core java volume 1, 旨在理解 java斷言——Assertion 的相關知識;
【1】使用斷言
1.1)斷言機制: 允許在測試期間向代碼中插入一些檢查語句。 當代碼發布時, 這些插入的檢測語句將被自動地移走;
- 1.1.1)java 引入了 關鍵字assert, 有兩種形式:
assert 條件; 和 assert 條件:表達式; - 1.1.2)以上兩種形式 都會對條件進行檢測: 如果結果為 false, 則拋出一個 AssertionException異常, 在第二種形式中, 表達式將被傳入 AssertionError 的構造器中,并轉換成一個 消息字符串;
Annotation)
- A1)表達式部分的唯一目的是產生一個消息字符串;
- A2) AssertionError 對象并不存儲表達式的值, 因此,不可能在以后得到它;
- A3)如JDK 所說, 如果使用表達式的值, 就會鼓勵coders 試圖從斷言中恢復程序的執行, 這不符合斷言機制的初衷;
1.2)看個荔枝:
- 1.2.1)要想斷言x 是一個 非負數值, 只需要簡單地使用下面這條語句:assert x >=0;
- 1.2.2)或者:將 x 的實際值傳遞給 AssertionError 對象, 從而可以在后面顯示出來, assert x >=0 : x; (因為x 將被傳入AssertionError 構造器, 并轉換為一個消息字符串)
【2】啟用和禁用斷言
2.1)默認情況下, 斷言被禁用。可以在運行程序時用 -enableassertions 或-ea 選項啟用它:
java -enableassertions MyApp
- 2.1.1)需要注意的是: 在啟用或禁用斷言時不必重新編譯程序。啟用和禁用斷言是類加載器的功能, 當斷言被禁用時, 類加載器將跳過斷言代碼, 因此,不會降低程序運行的速度;
- 2.1.2)也可以在某個類或某個包中使用斷言: 如, java -ea:MyClass -ea:com.mycompany.lib … MyApp
- 2.1.3)也可以使用選項 -disableassertions 或 -da 禁用某個特定類和包的斷言: java -ea:… -da:MyClass MyApp
Attention)
- A1)有些類不是由類加載器加載, 而是直接由虛擬機加載。 可以使用這些開關有選擇地啟用或禁用那些類中的斷言;
- A2)然而, 啟用和禁用所有斷言的 -ea 和 -da 開關不能應用到那些沒有類加載器的系統類上; 對于這些系統類來說, 需要使用 -enablesystemassertions/-esa 開關來啟用斷言;
【3】使用斷言完成參數檢查
3.1)在java中, 給出了 3種處理系統錯誤的機制(Mechanism):
- M1)拋出一個異常;
- M2)日志;
- M3)使用斷言;
3.2)什么時候應該選擇使用斷言呢?記住下面幾點(Points):
- P1)斷言失敗是致命的, 不可恢復的;
- P2)斷言的檢查只用于開發和測試階段;
所以, 不應該使用斷言向程序的其他部分通告發生了可恢復性的錯誤, 或者, 不應該作為程序向用戶通告問題的手段。 斷言只應該用于在測試階段確定程序內部的錯誤位置;
3.3)看個荔枝:
- 3.3.1)文檔指出, 如果方法中使用了錯誤的下標值,那么就會拋出一個異常, 這是方法與調用間約定的處理行為;
- 3.3.2)如果對這個方法做個改動:
@param a the array to be sorted (must not be null)
現在, 這個方法的調用者就必須注意了: 不允許用null 數組調用這個方法, 并在這個方法的開頭使用斷言: assert a!=null; - 3.3.3)前置條件:計算機科學家把這種約定稱為前置條件;最初的方法對參數沒有前置條件, 即承諾在任何條件下都能夠給予正確的執行;修訂后的方法有一個前置條件, 即 a 非空;
- 3.3.4)如果調用者在調用這個方法時沒有提供滿足這個前置條件的參數, 所有的斷言都會失敗, 并且這個方法可以執行它想做的任何操作;
【4】為文檔假設使用斷言
Conclusion)斷言和日志記錄的區別: 斷言是一種測試和調試階段所使用的戰術性工具, 而日志記錄是一種在程序的整個生命周期都可以使用的策略性工具;
- API java.lang.ClassLoader 1.0
void setDefaultAssertionStatus(boolean b) 1.4 : 對于通過類加載器的所有類來說, 如果沒有顯式地說明類或包的斷言狀態, 就啟用或者禁用斷言;
void setClassAssertionStatus(string className, boolean b) 1.4 :對于給定類和它的內部類, 啟用或者禁用斷言;
void setPackageAssertionStatus(string packageName, boolean b) 1.4 :對于給定包或其子包中的所有類, 啟用或禁用斷言;
void clearAssertionStatus() 1.4 :移除所有類和包的顯式斷言狀態設置, 并禁用所有通過這個類加載器加載的類的斷言;
總結
以上是生活随笔為你收集整理的java断言——Assertion的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 连锁店电脑系统(电脑零售店管理)
- 下一篇: java日志——基本日志+高级日志