Java 断言整理
编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设 断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真 可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新起用断言。 使用断言可以创建更稳定,品质更好且易于除错的代码 当需要在一个值为FALSE时中断当前操作的话,可以使用断言,单元测试必须使用断言(Junit/JunitX) ,除了类型检查和单元测试外,断言还提供了一种确定各种特性是否在程序中得到维护的极好的方法, 使用断言使我们向按契约式设计更近了一步。
常见的断言特性
前置条件断言:代码执行之前必须具备的特性
后置条件断言:代码执行之后必须具备的特性
前后不变断言:代码执行前后不能变化的特性
断言使用方式
断言可以有两种形式
public class AssertExampleOne{ public AssertExampleOne(){} public static void main(String args[]){ int x=10; System.out.println("Testing Assertion that x==100"); assert x=100:"Out assertion failed!"; System.out.println("Test passed!"); } }
如果编译时未加 -source1.4,则编译通不过
在执行时未加 -ea 时输出为
Out assertion failed!
at AssertExampleOne.main(AssertExampleOne.java:6)
断言的副作用
由于程序员的问题,断言的使用可能会带来副作用 ,例如:
boolean isEnable=false;//... assert isEnable=true;
public class AssertExampleTwo{ public static void main(String args[]){ boolean isEnable=false; //... assert isEnable=true; if(isEnable==false){ throw new RuntimeException("Assertion shoule be enable!"); } } } boolean boo = list.removeAl(); assert boo;
public class AssertTest{ public static void main(String[] args){ AssertTest at = new AssertTest(); try { at.assertMe(true); at.assertMe(false); } catch (AssertionError e) { e.printStackTrace(); System.out.println("断言为假!!!"); } System.out.println("go on !!!!"); } private void assertMe(boolean boo){ int s = 0; assert boo:++s; //当boo 为真时,assert语句将被忽略,对应的++s 也不会执行,当boo为假时,assert中的第二个参数表达式将会被执行,并且将结果作为构造AssertError的参数,并且抛出AssertError错误 System.out.println(boo+" condition "+s); } }