断言是什么?
断言允许在测试期间向代码中插入一些检查语句,当代码发布时,这些插入的检查语句将会自动地移走
断言的定义
断言通过assert关键字实现,有两种形式:
- assert condition;
- assert condition: expression;
判断condition是否成立,false则抛出AssertionError异常,而在第二种形式,expression会被传入AssertionError的构造方法并转换成消息字符串,不能获取其值
断言意义和实现
下面代码用于[0,3]随机正整数生成,判断条件有i ==0 和 i ==1以及其他,这个其他一定会等于2吗?
Random random = new Random();
int i = random.nextInt(3);
if (i == 0) {
System.out.println(0);
} else if (i == 1) {
System.out.println(1);
} else {
System.out.println(2);
}
貌似可以肯定,但在大项目中,实际上不能确定 i 的值有没有在中途经过修改,如果每次对于这样的代码都要经过一次如下的肯定判断进行测试,测试之后又要把它删除,否则这些判断会让程序的运行速度降低
if(i==2){
System.out.println(2);
}
为此引进断言在测试期间进行检查,且这些检查语句会自动地删除不影响最终的程序
Random random = new Random();
int i = random.nextInt(3);
if (i == 0) {
System.out.println(0);
} else if (i == 1) {
System.out.println(1);
} else {
assert i == 2;
System.out.println(2);
}
如果 i 在运行期间改变且不等于2,else中会抛出AssertionError异常,也可传入参数用于构造AssertionError,以便以后打印具体的错误
assert i == 2 : "i != 2";
启用和禁用断言
断言默认为关闭,启用和禁用断言无需再次编译代码
在当前运行程序中通过-enableassertion或-ea启动断言
java -enableassertion programName
如果需对某个类或整个包中的所有类启动断言
java -ea:className
java -ea:com.example.demo
如要禁用断言通过-disableassertion或-da启动断言,禁用后类加载器会跳过断言代码
java -da:className
java -da:com.example.demo