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断言失败将面临程序的退出。这在一个生产环境下的应用是绝不能容忍的。一般都是通过异常处理来解决程序中潜在的错误。如果使用断言就很危险,一旦失败系统就挂了。

标签: none

添加新评论