斷言概述:
編寫代碼時,我們總是會做出一些假設,斷言就是用於在代碼中捕捉這些假設。
可以將斷言看作是異常處理的一種高級形式。
斷言表示為一些布爾表達式,程序員相信在程序中的某個特定點該表達式值為真。
可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言而在部署時禁用斷言。同樣,程序投入運行后,最終用戶在遇到問題時可以重新起用斷言。
使用斷言可以創建更穩定,品質更好且易於除錯的代碼。
當需要在一個值為FALSE時中斷當前操作的話,可以使用斷言。
單元測試必須使用斷言(Junit/JunitX)。
除了類型檢查和單元測試外,斷言還提供了一種確定個種特性是否在程序中得到維護的極好的方法。
使用斷言使我們向按契約式設計更近了一步。
常見的斷言特性:
前置條件斷言:代碼執行之前必須具備的特性
后置條件斷言:代碼執行之后必須具備的特性
前后不變斷言:代碼執行前后不能變化的特性
斷言使用格式:
斷言可以有兩種形式
1.assert 布爾表達式
2.assert 布爾表達式:消息
使用第一種格式,當布爾類型表達式為false時,拋出AssertionError異常;如果是第二種格式,則輸出錯誤消息。
斷言的啟用:
在默認情況下,斷言不起作用,在eclipse等工具中可以開啟和關閉斷言功能,
選擇菜單--Run--Run Configuration--Java Application--選擇對應的類--Arguments--VM argument--填入-ea/-da
關於-ea(開啟斷言)和-da(關閉斷言)的說明如下
java -ea 類名
java -ea:包名 -da:類名
選項-ea、-da用於激活和禁用斷言。
如果選項不帶任何參數,則表示激活或禁用所有用戶類;
如果帶有包名或類名,則表示激活或禁用這些類或包;
如果包名稱后面跟有三個“.”,則表示這個包及子包;
如果只有三個“.”,則代表無包名。
案例:
public class TestAssertion{
public static void main(String[] args){
assert(1==0):"1和0不相等!";
}
}
開啟斷言后,運行結果,會報main方法的異常:1和0不相等!
何時需要使用斷言:
1.可以在預計正常情況下程序不會到達的地方放置斷言 :assert false;
2.斷言可以用於檢查傳遞給私有方法的參數。(對於公有方法,因為是提供給外部的接口,所以必須在方法中有相應的參數檢驗才能保證代碼的健壯性);
3.使用斷言測試方法執行的前置條件和后置條件;
4.使用斷言檢查類的不變狀態,確保任何情況下,某個變量的狀態必須滿足。(如age屬性應大於0小於某個合適值)。
什么地方不要使用斷言:
斷言語句不是永遠會執行,可以屏蔽也可以啟用
因此:
1.不要使用斷言作為公共方法的參數檢查,公共方法的參數永遠都要執行;
2.斷言語句不可以有任何邊界效應,不要使用斷言語句去修改變量和改變方法的返回值。