断言的使用
断言使程序具有自我保护能力。
假设确信某个属性符合要求,并且代码的执行需要依赖于这个属性。这种情况下,我们一般希望进行检查,或者抛出一个异常,但是如果这样写,这段代码会一直保留在程序中,即使测试完毕也不会自动地删除。如果在程序中含有大量的这种检查,那么程序会运行的相当慢。
因此我们使用断言机制。断言机制允许在测试期间向代码中插入一些检查语句。当代码发布时,这些插入的检测语句会被自动地移走。
这里引入了关键字assert。一般有两种形式:
assert 条件; 或者assert 条件:表达式;
例如:
assert x >= 0;
assert x >= 0 : x ;//将x的实际值传递给了AssertionError对象
这两种形式都会对条件进行检测,如果结果为false,则抛出一个AssertionError异常。而在后者形式中,表达式会被传入AssertionError的构造器,并且转换成一个消息字符串。但需要注意的是,AssertionError对象并不存储表达式的值,因此不可能在之后得到使用它的值。
使用断言可以完成参数检查。
众所周知,java语言中给出了三种处理系统错误的机制:
抛出一个异常
日志
使用断言
抛出异常十分熟悉了,我就不介绍了。对于断言来说,在进行选择时,需要注意,断言失败是致命的、不可恢复的错误,而且断言检查只应用于开发和测试阶段。因此,不应该使用代言向程序的其他部分通告发生了可恢复性错误,或者,不应该作为程序向用户通告问题的手段。断言仅仅应当用于测试阶段确定程序内部的错误位置。而日志记录(API)则是一种在程序整个生命周期都可以使用的策略性工具,帮助程序员观察程序运行的操作过程,且开销很小。
使用断言的情况例如:
if(i % 3 == 0)
...
else if(i % 3 ==1)
...
else //(i % 3 == 2)
...
但这样编写代码容易出现错误。i % 3可能产生余数为负的结果,因此在if语句之前先使用断言。
改变后的代码如下:
assert i >= 0;
if(i % 3 == 0)
...
else if(i % 3 ==1)
...
else {
assert i % 3 == 2;
...
}