斷言(Assertion)

例外是程式中非預期的錯誤,例外處理是在這些錯誤發生時所採取的措施。

有些時候,您預期程式中應該會處於何種狀態,例如某些情況下某個值必然是多少,這稱之為一種斷言(Assertion),斷言有兩種情況:成立或不成立。當預期結果與實際執行相同時,斷言成立,否則斷言失敗。

Java在JDK 1.4之後提供斷言陳述,有兩種使用的語法:

assert <boolean_expression>;
assert <boolean_expression> : <detail_expression>;


boolean_expression如果為true,則什麼事都不會發生,如果為false,則會發生 java.lang.AssertionError,此時若採取的是第二個語法,則會將detail_expression的結果顯示出來,如果是個物 件,則呼叫它的toString()顯示文字描述結果。

一個使用斷言的時機是內部不變量(Internal invarant)的判斷,例如在某個時間點上,或某個狀況發生時,您判斷某個變數必然要是某個值,舉個例子來說:
 

  • AssertionDemo.java
public class AssertionDemo {
public static void main(String[] args) {
if(args.length > 0) {
System.out.println(args[0]);
}
else {
assert args.length == 0;
System.out.println("沒有輸入引數");
}
}
}


在正常的預期中,陣列長度是不會小於0的,所以一但執行至else區塊,陣列長度必然只有一個可能,就是等於0,您斷言args.length==0結果 必然成立,else之中的程式碼也只有在斷言成立的狀況下才能執行,如果不成立,表示程式運行存在錯誤,else區塊不應被執行,您要停下來檢查程式的錯 誤,事實上斷言主要的目的通常是在開發時期才使用。

斷言功能是在JDK 1.4之後提供的,由於斷言使用assert作為關鍵字,為了避免您以前在JDK 1.3或更早之前版本的程式使用了assert作為變數,而導致的名稱衝突問題,預設上執行時是不啟動斷言檢查的,如果您要在執行時啟動斷言檢查,可以使用-enableassertions或是-ea引數,例如:
 

 java -ea AssertionDemo


您可以啟用斷言,但選擇性的使用-disableassertions或-da關閉某些類別中的斷言機制,例如關閉onlyfun.caterpillar.Foo類別中的斷言:

 java -ea -da:onlyfun.caterpillar.Foo AssertionDemo


或是選擇性的使用-disableassertions或-da關閉某些套件中的斷言機制,例如關閉onlyfun.caterpillar套件中的斷言:

 java -ea -da:onlyfun.caterpillar... AssertionDemo



另一個使用斷言的時機為控制流程不變量(Control flow invariant)的判斷,例如在使用switch時,假設您已經列出了所有的可能常數:

...
switch(var) {
    case Constants.Con1:
        ...
        break;
    case Constants.Con2:
        ...
        break;
    case Constants.Con3:
        ...
        break;
    default:
        assert false : "非定義的常數";
}
...


假設您已經在switch中列出了所有的常數,即var不該出現Constants.Con1、Constants.Con2、 Constants.Con3以外的常數,則如果發生default被執行的情況,表示程式的狀態與預期不符,此時由於assert false必然斷言失敗。

  • 總結就是,斷言是判定程式中的某個執行點必然是某個狀態,所以它不能當作像if之類的判斷式使用,簡單的說它不應是程式執行流程的一部份。
posted @   许仙儿  阅读(244)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示