1.1. 語法表示
兩種表達式,分別如下:
assert expression1;
assert expression1: expression2;
1.2. 語義含義
1. 在運行時,如果關閉了assertion功能,這些語句將不起任何作用。
2. 如果打開了assertion功能,那么expression1的值將被計算,如果它的值為false,該語句強拋出一個AssertionError對象。如果assertion語句包括expression2參數(shù),程序?qū)⒂嬎愠?/span>expression2的結果,然后將這個結果作為AssertionError的構造函數(shù)的參數(shù),來創(chuàng)建AssertionError對象,并拋出該對象;如果expression1值為true,expression2將不被計算。
3. 一種特殊情況是,如果在計算表達式時,表達式本身拋出Exception,那么assert將停止運行,而拋出這個Exception。
1.3. 運行
1. 這種程序必須在JDK1.4(或者更高版本)的JRE下運行。
2. 參數(shù) -esa和 -dsa:
它們含義為開啟(關閉)系統(tǒng)類的assertion功能。 -esa和-dsa的全名為-enablesystemassertions和-disenablesystemassertions,全名和縮寫名有同樣的功能。
3. 參數(shù) -ea和 -ea:
它們含義為開啟(關閉)用戶類的assertion功能。
-ea和-da的全名為-enableassertions和-disenableassertions,全名和縮寫名有同樣的功能。
下面表格表示了參數(shù)及其含義。
參數(shù) |
例子 |
說明 |
-ea |
java -ea |
打開所有用戶類的assertion |
-da |
java -da |
關閉所有用戶類的assertion |
-ea:<classname> |
java -ea:MyClass1 |
打開MyClass1的assertion |
-da:<classname> |
java -da: MyClass1 |
關閉MyClass1的assertion |
-ea:<packagename> |
java -ea:pkg1 |
打開pkg1包的assertion |
-da:<packagename> |
java -da:pkg1 |
關閉pkg1包的assertion |
-ea:... |
java -ea:... |
打開缺省包(無名包)的assertion |
-da:... |
java -da:... |
關閉缺省包(無名包)的assertion |
-ea:<packagename>... |
java -ea:pkg1... |
打開pkg1包和其子包的assertion |
-da:<packagename>... |
java -da:pkg1... |
關閉pkg1包和其子包的assertion |
-esa |
java -esa |
打開系統(tǒng)類的assertion |
-dsa |
java -dsa |
關閉系統(tǒng)類的assertion |
綜合使用 |
java -dsa:MyClass1:pkg1 |
關閉MyClass1和pkg1包的assertion |
其中...代表,此包和其子包的含義。例如我們有兩個包為pkg1和pkg1.subpkg。那么pkg1...就代表pkg1和pkg1.subpkg兩個包。
1.4. Assert使用場合
1.4.1. 適宜使用場合
1. 使用assert來檢查private和protected函數(shù)中的參數(shù)預處理(preconditions)和后處理(postconditions)。
2. 使用assert來檢查參數(shù)或者變量的特殊值,一旦參數(shù)或者變量為這些特殊值,則跟這些參數(shù)有變量有關的操作不應該出現(xiàn)。
eg.









3. 使用assert來檢查控制流(無效代碼分支)。
eg.


















4. 使用assert來檢查你的返回值(傳遞條件)。
Eg.










1.4.2. 不適宜使用場合
1. 不要在public函數(shù)中使用assert來驗證參數(shù)。
這些函數(shù)應該拋出NullPointerException,IllegalArgumentException,或者其他相關的exception。
2. 不要使用assert來檢查軟件用戶的錯誤。應該拋出IllegalArgumentException。
3. 不要使用assert來完成任何工作。如果你使用了assert來完成一些功能,那么assertions一旦被關閉了怎么辦?
4. 不要無聊地將assert拋出的錯誤消息國際化。一旦assertions關閉,你不是白做工了?