assert断言

assert 断言

断言检查“按程序设计本应永远成立”的内部条件。失败时抛出 AssertionError,通常代表程序员错误。

语法

assert condition;
assert condition : detailMessage;
double average(int total, int count) {
    assert count > 0 : "count must be positive: " + count;
    return (double) total / count;
}

启用

JVM 默认关闭断言:

代码块BASH · 3 行收起展开
java -ea Main
java -enableassertions Main
java -da Main

也可以按包或类启用:

代码块BASH · 2 行收起展开
java -ea:com.example... Main
java -ea:com.example.Service Main

适合场景

  • 私有方法的内部不变量。
  • 理论上不可到达的分支。
  • 算法中间状态。
  • 测试和调试阶段尽早暴露缺陷。

不适合场景

断言可能被禁用,所以不能承担必要业务逻辑:

  • 不用于公开方法参数校验,应抛 IllegalArgumentException 等异常。
  • 不用于用户输入、网络数据、配置或数据库数据。
  • 不用于权限与安全检查。
  • 表达式中不要放写文件、扣款、删除等副作用。
代码块JAVA · 5 行收起展开
// 错误:关闭断言后 remove 不执行
assert list.remove(value);

boolean removed = list.remove(value);
assert removed : "value should exist";

JUnit 的 assertEquals、assertThrows 等不受 JVM -ea 开关影响,单元测试应使用测试框架断言。

延伸阅读