Java斷言
1.斷言的概念
Java的斷言機制assert是一種用於測試階段的語法特性,它允許我們在測試期間向程式碼中插入一些檢查語句。程式碼釋出時這些檢測語句將被自動移除。
斷言關鍵字assert有下列兩種形式
- assert 條件;
- assert 條件:表示式;
當結果為false時,會丟擲一個AssertionError
異常。在第二種形式中,表示式將被傳入異常的構造器,構造出你想要的一種訊息字串。
注意這個訊息字串僅在這個時候被建立並跟隨異常展示出來,而不能以任何方式被儲存。因為如果儲存為一個記憶體中的變數,意味著斷言機制可能脫離測試環境而影響到程式碼的真實執行。
例如,我們要斷言x是一個正數,只需要使用以下形式。
assert x > 0;
也可以將x的值傳遞給異常構造器,從而顯示。
assert x > 0 : x;
2. 啟用和禁用斷言
預設情況下斷言被禁用,可以在執行程式時用-enableassertions
或-ea
這兩個引數中的一個來啟用。
啟用和禁用斷言時不需要重新編譯程式,因為啟用和禁用斷言是類載入器的功能,而類載入器在解釋位元組碼階段執行。
-
也可以在某個類或者整個包中使用斷言,如
java -ea:MyClass -ea:com.pedro.src... MyApp
這段程式碼將開啟
MyClass
類以及com.pedro.src
包和它的所有子包中的斷言。 -
也可以用選項
-disableassertions
或-da
禁用某個特定類和包的斷言java -ea:... -da:MyClass MyApp
3.使用斷言完成引數檢查
使用斷言有兩個需要注意的條件
- 斷言失敗應該是一種致命且不可恢復的錯誤。
- 斷言檢查只用於開發和測試階段,它只用於程式設計師或測試人員確定程式內部的錯誤位置。
例如我們有一個方法簽名
static void sort(int[] array,int x,int y){
...
}
我們希望拒絕null陣列呼叫這個方法,那我們應該這樣做。
static void sort(int[] array,int x,int y){
assert a != null;
...
}
這樣的在方法開頭檢查引數的形式我們稱為前置條件。
4.為文件中的假設使用斷言
以下是一段示例程式碼,我們試圖用註釋的方式說明一個if-else分支中的假設。
if (i X 3 == 0)
...
else if (i X 3 = 1)
...
else // (i % 3 == 2)
...
我們也可以用斷言做這件事
if (i X 3 == 0)
...
else if (i X 3 = 1)
...
else
assert i % 3 == 2;
...
但是實際上,如果我們是經驗豐富的工程師,我們應該會考慮到i
可能是一個負值,所以最好在 if 語句之前使用另一個斷言。
assert i >= 0;
if (i X 3 == 0)
...
else if (i X 3 = 1)
...
else
assert i % 3 == 2;
...