断言
在防御式编程中,所有的外部因素(输入参数、环境变量等)都被看作是“邪恶”的,它们都是企图摧毁程序的罪恶本源,为了抵制它们,我们需要在程序中处处设卡检验,只有满足条件才能继续执行后续程序,以保证程序的正确性。断言(Assertion)就是用于确保程序执行正确的“关卡”,使用断言可以避免因错误的输入而导致的程序逻辑错误。
[一] 关于断言
断言是JDK1.4加入的新特性
JVM默认不启用断言功能(开启方法请看下文)
[二] 断言的语法
assert <布尔表达式> : <错误信息> ;
其中,<布尔表达式>返回true或false,用于判断是否断言成功;<错误信息>用于描述断言失败,可留空不写
[三] 小试断言
@Test
public void demo1() {
int a = 0;
assert a == 1;
// 输出:java.lang.AssertionError
}
@Test
public void demo2() {
int a = 0;
assert a == 1 : "a的值不是1";
System.out.println("a的值是" + a);
// 输出:java.lang.AssertionError:a的值不是1
}
@Test
public void demo3() {
int a = 1;
assert a == 1 : "a的值不是1";
System.out.println("a的值是" + a);
// 输出:a的值是1
}
【总结】
只有断言成功才会执行后续的代码,否则会抛出AssertionError错误并终止程序
[三] 断言开启与关闭
1. 在命令行中使用-ea和-da
① 首先,我们编写一个测试类AssertTest.java
public class AssertTest {
public static void main(String[] args) {
assert false : "断言被执行了";
System.out.println("断言没有被执行");
}
}
② 编译代码,并在默认情况下以及使用-ea/-da的情况下执行代码
- javac AssertTest.java
- java AssertTest
断言没有被执行
- java -da AssertTest
断言没有被执行
- java -ea AssertTest
Exception in thread "main" java.lang.AssertionError: 断言被执行了
at AssertTest.main(AssertTest.java:3)
【总结】
在JVM中,默认断言功能是关闭的,可以使用 -ea 对断言功能进行开启,使用 -da 对断言功能进行关闭
VM options -ea // 开启断言功能
VM options -da // 关闭断言功能