Java斷言及使用

2020-07-16 10:05:17
在 JDK 1.4 之後,Java 中增加了斷言的功能。斷言(Assertion)是一種偵錯程式的方式。在 Java 中,使用 assert 關鍵字來實現斷言。斷言的定義格式如下:

assert boolean 表示式 : 詳細資訊

以上程式碼中,boolean 表示式的結果為 true,則會忽略後面的詳細資訊;如果為 false,則提示的錯誤內容為詳細資訊;如果沒有宣告詳細資訊的描述,則系統會使用預設的錯誤資訊提示方式。

以下程式使用了斷言。
public static void main(String[] args) {
    // 定義一個陣列,長度為3
    int x[] = { 1, 2, 3 };
    // 此處斷言陣列長度為0,肯定是錯誤的
    assert x.length == 0;
}
以上程式中,語句assert x.length == 0;即為斷言,斷言條件x.length == 0預期為 true。如果計算結果為 false,則斷言失敗,丟擲 AssertionError。由於陣列 x 的長度是不可能為 0 的,所以,此處的斷言結果是錯誤的。

但此時執行程式並不會得到任何的結果,這是因為 Java 在設計此關鍵字時,考慮到了系統的應用,為了防止某些使用者使用 assert 作為關鍵字,所以在程式正常執行時斷言並不會起任何的作用,如果要想讓斷言起作用,則在使用 Java 執行時應該加入-enableassertions引數,可以簡寫為-ea

下面使用”-ea“執行程式,執行程式格式如下:

編譯程式:javac Test.java
驗證程式:java -ea Test

程式執行時出現以下錯誤:
Exception in thread "main" java.lang.AssertionError
        at Test.main(Test.java:6)

以上是斷言錯誤,因為陣列 x 的長度不可能是 0,但是,此時的資訊是系統預設的錯誤資訊,如果要想顯示自己的錯誤資訊,則可以使用另外一種斷言宣告格式。

Test 類程式碼修改如下:
public static void main(String[] args) {
    // 定義一個陣列,長度為3
    int x[] = { 1, 2, 3 };
    // 此處斷言陣列長度為0,肯定是錯誤的
    assert x.length == 0 : "陣列長度不為0";
}
再次驗證斷言,出現以下資訊:

Exception in thread "main" java.lang.AssertionError:陣列長度不為0
        at Test.main(Test.java:6)

以上就是將自定義的錯誤資訊進行輸出,當然,如果此時斷言的結果是正確的,則驗證肯定不會有任何的問題。

使用斷言需要注意以下幾點:
  1. 斷言失敗時會丟擲 AssertionError,導致程式結束退出。因此,斷言不能用於可恢復的程式錯誤,只應該用於開發和測試階段。
  2. 雖然斷言返回的是 boolean 值,但是並不能將其作為條件判斷語句。
  3. 斷言雖然有檢查執行結果的功能,但是一般在開發中並不提倡使用斷言,更好的方法是編寫單元測試。