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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM