我們知道C/C++語言中有斷言的功能(assert)。在Java SE 1.4版本以后也增加了斷言的特性。
斷言是為了方便調試程序,並不是發布程序的組成部分。理解這一點是很關鍵的。
默認情況下,JVM是關閉斷言的。因此如果想使用斷言調試程序,需要手動打開斷言功能。在命令行模式下運行Java程序時可增加參數-enableassertions或者-ea打開斷言。可通過-disableassertions或者-da關閉斷言(默認情況,可有可無)。
斷言的使用:
斷言是通過關鍵字assert來定義的,一般的,它有兩種形式。
1. assert <bool expression>; 比如 boolean isStudent = false; assert isStudent;
2. assert <bool expression> : <message>; 比如 boolean isSafe = false; assert isSafe : "Not Safe at all";
光說無用,舉幾個簡單的例子:
第一種形式:
-
public
class AssertionTest {
-
-
public static void main(String[] args) {
-
-
boolean isSafe =
false;
-
assert isSafe;
-
System.out.println(
"斷言通過!");
-
}
-
}
如果是在命令行模式下運行,需要指明開啟斷言功能。如
java -ea AssertionTest
如果是在IDE下,比如Eclipse,可這樣設置: Run as -> Run Configurations -> Arguments -> VM arguments:敲入-ea即可。
輸出結果:
Exception in thread "main" java.lang.AssertionError
at AssertionTest.main(AssertionTest.java:8)
第二種形式:
-
public
class AssertionTest {
-
-
public static void main(String[] args) {
-
-
boolean isSafe =
false;
-
assert isSafe :
"Not safe at all";
-
System.out.println(
"斷言通過!");
-
}
-
}
輸出結果:
Exception in thread "main" java.lang.AssertionError: Not safe at all
at AssertionTest.main(AssertionTest.java:7)
第二種形式和第一種的區別在於后者可以指定錯誤信息。
陷阱:
斷言只是為了用來調試程序,切勿將斷言寫入業務邏輯中。比如考慮下面這個簡單的例子:
-
public
class AssertionTest {
-
-
public static void main(String[] args) {
-
-
assert ( args.length >
0);
-
System.out.println(args[
1]);
-
}
-
}
該句assert (args.length >0)和if(args.length >0)意思相近,但是如果在發布程序的時候(一般都不會開啟斷言),所以該句會被忽視,因此會導致以下
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at AssertionTest.main(AssertionTest.java:7)
更好的替代品:
JUnit。