斷言(Assertion)
例外是程式中非預期的錯誤,例外處理是在這些錯誤發生時所採取的措施。
有些時候,您預期程式中應該會處於何種狀態,例如某些情況下某個值必然是多少,這稱之為一種斷言(Assertion),斷言有兩種情況:成立或不成立。當預期結果與實際執行相同時,斷言成立,否則斷言失敗。
Java在JDK 1.4之後提供斷言陳述,有兩種使用的語法:
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之類的判斷式使用,簡單的說它不應是程式執行流程的一部份。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律