Welcome 微信登录

首页 / 软件开发 / JAVA / Merlin的魔力: 使用断言

Merlin的魔力: 使用断言2011-02-02 IBM John Zukowski断言功能是 Java 1.4 发行版所具有的为人热切期盼的一项新功能。您可以将该功能看作是异常处理的一种高级形式。断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式的值为真。例如,程序员可能会在程序中包含断言,使您永远也不会到达 switch 语句中的 default 条件。

由于可以在任何时候启用或禁用断言验证,因此可以在测试时启用断言验证而部署时禁用断言验证。同样,程序投入运行后,最终用户在碰到问题时可以重新启用断言。

在本专栏文章中,通过演示两种不同的方式来启用和禁用断言以便优化代码测试和性能,我将向您讲述一些有关向代码中添加断言的基本知识。

断言关键字

断言检查就象异常处理,但是当断言失败时,却不会抛出异常,而会抛出一个 AssertionError 。象所有错误一样,从断言故障中恢复(如果不是不可能的话)就是很困难的,因为这样的故障表明程序状态已偏离正常操作参数。

使用断言的两个基本构造如下:

assert booleanExpression;
assert booleanExpression : message;

注意,可选的消息(message)将作为错误抛出的结果显示出来。

可以将断言语句作为方法的前置条件或后置条件来添加。也可以建立布尔表达式以调用方法。同样,您可能希望向 if 块中的 else 条件添加断言,这里已经设置了该条件,或者向 switch 语句中的缺省情况中添加断言,使缺省情况永远不可能到达。 assert 关键字的唯一限制在于它必须位于可执行块中。不能将断言同实例的类变量声明一块使用,但却可以将其置于任何方法内。

启用断言

如果您想使用断言,那么您必须使用一些专门的命令行选项来编译并运行程序。由于编译器运行于 1.3 兼容模式,因此您必须显式地要求运行在 1.4 模式下。要编译带有断言的程序,只需向 Java 编译器传递 -source 1.4 设置。缺省情况下,会禁用断言检查,因此在运行时您也要显式地启用这一功能。请使用 -enableassertions 选项或更短的 -ea 选项来启用断言检查。

下面的简单示例向您介绍了向程序中添加断言检查的一些必要步骤。它检查命令行参数的数目,如果值不为 0 时,则报告问题:

public class AssertTest {
public static void main(String args[]) {
assert args.length == 0 : args.length + " != 0";
System.out.println(args.length);
}
}

确保按如下所示使用 -source 选项来编译该程序:

javac -source 1.4 AssertTest.java

要测试该程序,只需运行该程序并传递命令行参数:

java AssertTest 1 2 3 4

因为该程序是用来显示参数的数目,所以该测试程序将显示四。由于在缺省情况下禁用了断言检查,因此不会检测到任何断言错误。