Java assert断言的用法(附带实例)
断言是防御性编程中常用的一种习惯语法。假设你确信满足某个特定属性,并且在代码中依赖该属性。例如,你可能正在计算:
注意,在 Java 中,断言旨在作为验证内部假设的调试辅助工具,而不是作为强制执行契约的机制。例如,如果想要报告公有方法的不适当参数,请不要使用断言,而是抛出 IllegalArgumentException 异常。
或者将 x 的实际值传递给 AssertionError 对象,以便稍后显示:
还可以使用 -disableassertions 或 -da 选项来禁用指定类和包中的断言:
此外,还可以通过下面的方法以编程方式控制类加载器的断言状态:
double y = Math.sqrt(x);你很确信 x 不是负数,但是仍然想进行双重检查,而不是让“不是数字”的浮点值进入计算。当然,也可以抛出一个异常:
if (x < 0) throw new IllegalStateException(x + " < 0");但是,即使在测试完成后,这种特殊情况仍会留在程序中,从而降低运行速度。断言机制允许在测试期间进行检查,并在生产代码中自动删除这些检查。
注意,在 Java 中,断言旨在作为验证内部假设的调试辅助工具,而不是作为强制执行契约的机制。例如,如果想要报告公有方法的不适当参数,请不要使用断言,而是抛出 IllegalArgumentException 异常。
Java断言的使用
Java 中有两种形式的断言语句:assert condition; assert condition : expression;assert 语句会评估断言的条件,如果条件错误,则抛出 AssertionError 异常。在第二个语句中,表达式将转换为字符串,随后该字符串成为错误对象的消息。
例如,要想断言 x 是一个非负数,只须使用以下语句:注意,如果表达式是 Throwable,则它也会被设置为断言错误的原因。
assert x >= 0;
或者将 x 的实际值传递给 AssertionError 对象,以便稍后显示:
assert x >= 0 : x;
Java断言的启用和禁用
默认情况下,断言是被禁用的。可以在运行程序时使用 -enableassertions 或 -ea 选项启用断言:java -ea MainClass不必重新编译程序,因为启用或禁用断言是由类加载器处理的。当断言被禁用时,类加载器会删除断言代码,因此不会降低程序运行速度。甚至可以在特定类或整个包中启用断言,例如:
java -ea:MyClass -ea:com.biancheng.mylib... MainClass该命令会启用 MyClass 类和 com.biancheng.mylib 包及其子包中所有类的断言。选项 -ea... 会在默认包的所有类中启用断言。
还可以使用 -disableassertions 或 -da 选项来禁用指定类和包中的断言:
java -ea:... -da:MyClass MainClass当使用 -ea 和 -da 开关启用或禁用所有断言(而不仅仅是特定的类或包)时,它们并不适用于那些没有类加载器的“系统类”。使用 -enablesystemassertion/-esa 开关能够启用系统类的断言。
此外,还可以通过下面的方法以编程方式控制类加载器的断言状态:
void ClassLoader.setDefaultAssertionStatus(boolean enabled); void ClassLoader.setClassAssertionStatus(String className, boolean enabled); void ClassLoader.setPackageAssertionStatus(String packageName, boolean enabled);与 -enableassertions 命令行选项一样,setPackageAssertionStatus 方法设置给定包及其子包的断言状态。