关于 JDK1.4 增加的 assert 语句
1. assert 语句的语法
JDK1.4 增加了 assert 语句,它的语法如下:
assert assumption 或者
assert assumption : error message or error code
assumption 应该是一个布尔值。(或者是条件表达式,反正最终的结果为 true 或 false 。)
如果 assumption 为 true ,那么一切如常,这个语句就像没有出现一样,如果 assumption 为 false ,那么程序将扔出一个 java.lang.AssertionError 。如果在代码里采用了第二种带 error message 或者 error code 的写法的话,该 error message 或者 error code 将跟随 java.lang.AssertionError 一起显示出来。
2. 带 assert 语句的代码的编译
如果你在代码中使用了 assert 语句,那么你使用 javac 编译时应该像这样:
javac –source 1.4 **.java
否则的话, assert 关键字将不被视为关键字。(这是因为 assert 语句是从 JDK1.4
才有的。)
当然,如果你使用 JDK1.4 及以上编译时,不用 -source 1.4 参数的话会出现 warning 。
3. 运行时启动 assert 。
缺省情况下 assert 是不被启用的。
运行时应该这样启用 assert :
java –ea: 类名 类名
或者
java –ea: 包名 … 类名
相应的用 -da 关闭 assert 。
(详细可以参考 java 命令的帮组)。
4. assert 的好处及使用。
我以为 assert 主要用来 debug 。使用它能很容易定位错误。另外,在代码的适当地方用上 assert 语句,能够在代码中某些值的取值范围发生变化时迅速的定位代码错误,发现代码的 bug 。请看下面这个例子。
假设 i 现在的取值就是 0 和 1 。
那么我们可以这么写代码:
if (0 == i) {
….
} else { //i == 1
…
}
当 i 的值的范围发生了变化(这是完全有可能的,因为这个 i 的值可能是其它模块给本模块传的参数。),这个代码就很有可能有潜在的 bug ,而且这个 bug 未必能立即表现出来。即使表现出来了,要定位到这个错也不容易。因为你很可能仍然坚信 i 的值就是 0 或者 1 。
但是如果将以上代码改写成这样:
if (0 == i) {
….
} else { //i == 1
assert i==1:”The i value isn’t 0 or 1 .”
….
}
那么一旦 i 的取值范围超过了 0,1 ,那么立即会扔出一个带有错误信息的 java.lang.AssertionError 。这样对错误的定位就一目了然了。
5. 最后写一个运行的例子:
public class TestAssert {
public static void main(String[] args) throws Exception {
int i=100;
String errorMsg = "This is a error";
int errorCode = 10000;
assert i>200:errorCode;
assert i>200:errorMsg;
}
}
然后编译:
javac –source 1.4 TestAssert.java
然后运行:
java –ea:TestAssert TestAssert