![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5COyUWY0gDM1E2NjZjMihTZjZTNxQDOmljY5ATMiBzNl9CX5EzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLzM3Lc9CX6MHc0RHaiojIsJye.png)
淺析Java斷言
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;
...