天天看點

淺析Java斷言

淺析Java斷言

淺析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;
    ...