斷言的概念
斷言用于證明和測試程序的假設,比如“這里的值大于 5”。
斷言可以在運行時從代碼中完全刪除,所以對代碼的運行速度沒有影響。
斷言的使用
斷言有兩種方法:
一種是 assert<<布爾表達式>> ;
另一種是 assert<<布爾表達式>> :<<細節描述>>。
如果布爾表達式的值為false , 將拋出AssertionError 異常; 細節描述是AssertionError異常的描述文本使用 javac –source 1.4 MyClass.java 的方式進行編譯示例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class AssertExample { public static void main(String[] args) { int x = 10 ; if (args.length > 0 ) { try { x = Integer.parseInt(args[ 0 ]); } catch (NumberFormatException nfe) { /* Ignore */ } } System.out.println( "Testing assertion that x == 10" ); assert x == 10 : "Our assertion failed" ; System.out.println( "Test passed" ); } } |
由于引入了一個新的關鍵字,所以在編譯的時候就需要增加額外的參數,要編譯成功,必須使用 JDK1.4 的 javac 并加上參數'-source 1.4',例如可以使用以下的命令編譯上面的代碼:
1
|
javac - source 1.4 AssertExample.java |
以上程序運行使用斷言功能也需要使用額外的參數(并且需要一個數字的命令行參數),例如:
1
|
java -ea AssertExample 1 |
程序的輸出為:
1
2
3
|
Testing assertion that x == 10 Exception in thread "main" java.lang.AssertionError:Our assertion failed at AssertExample.main(AssertExample.java:20) |
由于輸入的參數不等于 10,因此斷言功能使得程序運行時拋出斷言錯誤,注意是錯誤, 這意味著程序發生嚴重錯誤并且將強制退出。斷言使用 boolean 值,如果其值不為 true 則 拋出 AssertionError 并終止程序的運行。
斷言推薦使用方法
用于驗證方法中的內部邏輯,包括:
- 內在不變式
- 控制流程不變式
- 后置條件和類不變式
注意:不推薦用于公有方法內的前置條件的檢查。
運行時屏蔽斷言
運行時要屏蔽斷言,可以用如下方法:
java –disableassertions 或 java –da 類名
運行時要允許斷言,可以用如下方法:
java –enableassertions 或 java –ea類名