概述
断言使用的时候不是很多,测试时会使用,总的来说断言还是要慎重。在C和C++语言中都有assert关键,表示断言。在Java中,同样也有assert关键字,表示断言,用法和含义都差不多。在Java中,assert关键字是从JAVA SE 1.4 引入的,为了避免和老版本的Java代码中使用了assert关键字导致错误,Java在执行的时候默认是不启动断言检查的(这个时候,所有的断言语句都将忽略!),如果要开启断言检查,则需要用开关-enableassertions或-ea来开启。
语法
//1、assert <boolean>表达式
assert Expression1 ;
//如果<boolean表达式>为true,则程序继续执行。
//如果为false,则程序抛出AssertionError,并终止执行。
//2、assert <boolean> : <错误信息表达式>
assert Expression1 : Expression2 ;
//如果<boolean表达式>为true,则程序继续执行。
//如果为false,则程序抛出java.lang.AssertionError,并输入<错误信息表达式>。
断言使用场景
- 变量值明确
变量值如果很确定是某个值,则可以用断言。 - 执行不到的语句
某个地方语句确定是执行不会达到的,例如没有default的switch,则default可加上断言。 - 前置条件
前置条件(precondition)是一条语句,在方法执行前必须为真。 - 后置条件
后置条件(postcondition)是一条语句,当前置条件满足且完全执行方法后,它为真 - 检查类的状态
加一个内部方法,返回布尔值,当检查类状态正常时返回true。
不要用断言场景
- 不要用断言做参数检查
因为无论断言是启用还是禁用,都必须进行参数检查的,而断言是可能被禁用的。并且断言报出的AssertionError异常,不能准确反馈运行时异常(例如IllegalArgumentException,IndexOutOfBoundsException或NullPointerException)。 - 不要用断言来完成程序正确操作所需的任何工作
例如,假设你想要从列表名称中删除所有空元素,并且知道该列表包含一个或多个空值。
错误的做法:
//行为包含在断言中
assert names.remove(null);
当断言被启用时,程序会正常工作,但在禁用时会失败,因为它不再从列表中删除空元素。
正确的用法:
//固定 - 动作先于断言
boolean nullsRemoved = names.remove(null);
assert nullsRemoved; //运行是否启用断言