Java断言assert的详细介绍
1、断言assert简介
assert的用法像是一种"契约式编程",顾名思义,如果程序的运行不满足某种特定条件或者输入未遵守某个约定,则程序将会终止执行。面对异常情况的处理,通常使用if来做逻辑处理,以实现程序的健壮性。面对异常情况,if的做法更显的温柔,而assert则是简单粗暴。使用if将会造成很大累赘,如下所示:
if(假设成立)
{
程序正常运行;
}
else
{
报错&&终止程序!(避免由程序运行引起更大的错误)
}
异常的发生毕竟是少数案例,如果处处用if来做判断处理,那么就会有无数个 if 语句,甚至会出现一个if 语句的括号从文件头到文件尾。在大多数情况下,意外的发生只是属于偶然性事件,所以这里有了assert断言。
2、断言的使用
断言的使用有两种形式
(1)assert Expression1
(2)assert Expression1:Expression2
其中Expression1应该总是一个布尔值,Expression2是断言失败时输出的失败消息的字符串。如果Expression1为假,则抛出一个 AssertionError,这是一个错误,而不是一个异常,也就是说是一个不可控制异常(unchecked Exception),由于AssertionError 是错误,如果不捕获,最终会迫使程序停机,但不推荐这样做,因为那样会使你的系统进入不稳定状态。
3、Java断言详细介绍
在Java中,assert关键字是从JDK 1.4 引入的,Java在执行的时候默认是不启动断言检查的(这个时候,所有的断言语句都将忽略),如果要开启断言检查,则需要用开关-enableassertions或-ea来开启。
assert关键字语法很简单,有两种用法:
(1)assert <boolean表达式>
如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出AssertionError,并终止执行。
(2)assert <boolean表达式> : <错误信息表达式>
如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出java.lang.AssertionError,并输出<错误信息表达式>。
请见下面的例子:
public class Test
{
public static void main(String args[])
{
//断言1结果为true,则继续往下执行
assert true;
System.out.println("断言1没有问题,Let`s Go!");
try
{
//断言2结果为false,程序终止
assert false : "断言失败,此表达式的信息将会在抛出异常的时候输出!";
System.out.println("断言2出现问题,Stop the World!");
}
catch (AssertionError err)
{
System.out.println(err.getMessage());
}
}
}
当没有开启断言功能时的输出结果为:
断言1没有问题,Let`s Go!
断言2出现问题,Stop the World!
当开启断言功能(-ea)时的输出结果为:
断言1没有问题,Let`s Go!
断言失败,此表达式的信息将会在抛出异常的时候输出!
4、断言assert的利弊
断言assert的判断和if语句差不多,但两者的作用有着本质的区别:assert关键字本意上是为测试调试程序时使用的,但如果不小心用assert来控制了程序的业务流程,那在测试调试结束后去掉assert关键字就意味着修改了程序的正常的逻辑。另外,断言assert断言失败将面临程序的退出。这在一个生产环境下的应用是绝不能容忍的。一般都是通过异常处理来解决程序中潜在的错误。如果使用断言就很危险,一旦失败系统就挂了。