在一个具有自我防御能力的程序中,断言是一个常用的习语。假设我们确认某个属性符合要求,并且在执行依赖于这个属性。如:double y=Math.sqrt(x);
我们确信,这里的x是一个非负数值,而这个方法要求它的调用 者只能提供一个正数。然而还是希望进行检查,以避免让错误的数值进入计算机操作中。当然,也可以抛出一个异常:if (x<0) throw new llegalArgumentExcepton("x<0");
但是这段代码会一直保留在程序中,即使测试完毕后也不会自动删除。如果在程序中大量含有这种检查,程序运行起来会相当慢。断言机制允许 在测试期间向代码中插入一些检查语句,当代码发布时,这些插入的检测语句将会被移走。java语言引入一个新关键字arrert
asset 条件;
assert 条
这两个语句都会对条件进行判定,如果结果为false,则抛出一个assertionerror异常。表达式部分的唯一目的是产生个消息字符串,assertionError对象并不存储表达式的值。因此,不可能在以后对它进行查询,如果使用表达式,的值,就会“鼓励程序员试图从断言失败中恢复程序的运行,这不符合断言的机制的初衷”
要想让断言x是一个非负数值,只需要使用下面这条语句:
assert x >=0;
或者将x的实际值传递给assetionError对象。
如果使用jdk就必须告诉编译器正在使用的asset关键字,用法如下:javac -source 1.4 MyClass.java 从jdk5.0开始,默认支持断言机制。
在默认情况下,断言是禁止用的,可以在运行程序时用-enableassertions或-ea选项启用它:如java -enableasertions myapp
需要注意的是,在启用或禁用断时不必重新编译程序,启用或禁用断言是类加载器功能,当断言被禁止时,类加载器将跳过断言代码。因此不会降低程序运行速度。也可以在某个类或某个包中使用断言,如:java -ea:MyClass -ea:com.mycompany.mylib...MyApp
这条命令将开户MyClass类以及在com.mycompany.mylib包在它的子包中的所有类的断言。选项:-ea将开启默认包中的所有类的断言。也可以用选项-disableasertions或da禁止用某个特定类的包的断言:如java -ea:...-da:MyClass MyApp