淺析Java斷言

pedro7發表於2021-08-18

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

相關文章