Java在1.4中新增了一个关键字:assert。在程序开发过程中使用它创建一个断言(assertion),它的
语法形式有如下所示的两种形式:
1、assert condition;
这里condition是一个必须为真(true)的表达式。如果表达式的结果为true,那么断言为真,并且无任何行动;如果表达式为false,则断言失败,则会抛出一个AssertionError对象。这个AssertionError继承于Error对象,而Error继承于Throwable,Error是和Exception并列的一个错误对象,通常用于表达系统级运行错误。
2、asser condition : expr;
这里condition是和上面一样的,这个冒号后跟的是一个表达式,通常用于断言失败后的提示信息,说白了,它是一个传到AssertionError构造函数的值,如果断言失败,该值被转化为它对应的字符串,并显示出来。
编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设。 可以将断言看作是异常处理的一种高级形式。 断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。 可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新起用断言。 使用断言可以创建更稳定,品质更好且易于除错的代码。 当需要在一个值为FALSE时中断当前操作的话,可以使用断言。 单元测试必须使用断言(Junit/JunitX)。 除了类型检查和单元测试外,断言还提供了一种确定个种特性是否在程序中得到维护的极好的方法。 使用断言使我们向按契约式设计更近了一步。
前置条件断言:代码执行之前必须具备的特性 后置条件断言:代码执行之后必须具备的特性 前后不变断言:代码执行前后不能变化的特性
断言可以有两种形式
使用第一种格式,当布尔类型表达式为false时,抛出AssertionError异常;如果是第二种格式,则输出错误消息。
@Test public void s1(){ int i = 6; // 如果参数不为 断言的值 会报断言错误【在这里即i!=6】 assert i==6; System.out.println("如果断言正常,我就被打印"); }
@Test public void s2(){ // 如果 表达式 1<2 为true,则忽略 表达式"yes",程序继续运行 // 如果表达式 1<2 为false ,则运行表达式 "yes" ,退出程序(报断言错误警告) assert 1<2 : "yes"; System.out.println("no"); }
@Test public void s3(){ int i = 3; switch (i){ case 1: System.out.println("正常"); break; case 2: System.out.println("正常那"); break; case 5: System.out.println("正常的"); break; default: assert false : "i的值为无效的"; } System.out.println("如果断言正常,我就被打印"); // 三元运算符 System.out.println(1>2 ? 1 : 2); }
String name = "12"; assert name!="12" : "错误"; System.out.println("no");
断言功能是用于软件的开发和测试的,也就是说,删去断言的那部分语句后,你程序的结构和运行不应该有任何改变,千万不要把断言当成程序中的一个功能来使用
学而不敲则罔,思而不敲则殆