J2SE 1.4 引入了 assert 關鍵字,這是 Java 語言層面最大的革新之一。斷言在軟體開發中是一種經典的除錯與測試手段,C、C++、Eiffel 等語言早已支援類似機制。雖然理論上斷言可用於證明程式正確性,但實務上複雜度極高,鮮少見到大規模應用。Java 的斷言設計目標明確:在開發與測試階段啟用,保障核心邏輯正確性;正式釋出時關閉,避免效能損耗。
Java 新增 assert 關鍵字,提供兩種寫法:
assert expression1;
assert expression1 : expression2;
true 程式繼續執行;若為 false 拋出 AssertionError 並終止。AssertionError 建構子的參數,方便除錯定位。| 形式 | expression1 為 true | expression1 為 false |
|---|---|---|
assert expr1; | 繼續執行 | 拋出 AssertionError(無訊息) |
assert expr1 : expr2; | 繼續執行(expr2 不會被求值) | 拋出 AssertionError,攜帶 expr2 結果 |
assert 語句等同空操作。false 則拋出 AssertionError;若包含 expression2,先計算其值再建構錯誤物件。assert 直接傳播該例外,不再產生 AssertionError。assert 0 < value;
assert 0 < value : "value=" + value;
assert ref != null : "ref doesn't equal null";
assert isBalanced();
因 assert 為新關鍵字,舊版 JDK 無法編譯。必須使用 JDK 1.4+ 並加上 -source 1.4 參數:
javac -source 1.4 Test.java
啟用/停用斷言的參數分為「系統類」與「使用者類」兩層,支援類名、套件名、子套件遞迴、無名套件等精細控制:
| 參數 | 範例 | 說明 |
|---|---|---|
-ea / -enableassertions | java -ea | 啟用所有使用者類斷言 |
-da / -disableassertions | java -da | 停用所有使用者類斷言 |
-ea:<class> | java -ea:MyClass | 啟用指定類斷言 |
-da:<class> | java -da:MyClass | 停用指定類斷言 |
-ea:<package> | java -ea:com.example | 啟用指定套件斷言 |
-ea:<package>... | java -ea:com.example... | 啟用套件及所有子套件斷言 |
-ea:... | java -ea:... | 啟用無名套件斷言 |
-esa / -enablesystemassertions | java -esa | 啟用系統類斷言 |
-dsa / -disablesystemassertions | java -dsa | 停用系統類斷言 |
IllegalArgumentException 等),而非 AssertionError。expression2 提供關鍵變數值,加速除錯。assert 是 Java 內建的輕量級契約式程式設計工具,正確使用能大幅提升程式碼可靠度與維護性。關鍵在於:開發時全開、測試時選開、上線時全關,並配合有意義的錯誤訊息,讓斷言真正成為「程式自我檢查」的防火牆。