断言是开发阶段的逻辑探针,非异常处理机制;仅验证内部不变式,启用需手动加-ea参数,禁用于公共方法、副作用表达式及io操作,错误信息须具体。

断言不是异常处理机制,而是开发阶段的逻辑探针——它不处理错误,只在条件不成立时立刻中断执行,暴露本不该发生的内部矛盾。
用对了,它能让你在代码跑出错结果前就停下来;用错了,比如塞进公共方法或带副作用,反而掩盖问题、误导调试。
断言启用必须手动加 -ea 参数
JVM 默认禁用所有 assert 语句,写了也等于没写。
- IntelliJ/Eclipse:运行配置 → VM options → 填
-ea - Gradle 测试:
test { jvmArgs = ['-ea'] } - 启动脚本:
java -ea MyApp
不加参数,断言完全不执行,连日志、变量修改都不会发生。
只用于验证“内部不变式”,不是校验用户输入
断言声明的是“这里必须为真,否则整个模块已不可信”,典型场景包括:
- 私有方法执行前后状态一致性:
assert list.size() == oldSize + 1 : "add() should increase size" - 循环中始终成立的约束:
assert maxSoFar >= arr[i] : "max invariant broken at " + i - 算法前提(如二分查找前):
assert isSorted(data) : "data must be sorted" - 枚举状态流转合法性:
assert state == State.PROCESSING || state == State.DONE
绝不能出现在这些地方
- 公共方法参数检查(该用
Objects.requireNonNull()或IllegalArgumentException) - 任何含副作用的表达式:
assert map.remove("key") != null(上线后 key 还在 map 里) - 日志、计数、IO、网络调用等:
assert logger.debug("x=" + x)(上线后日志消失,且语法可能报错) - try-catch 里捕获
AssertionError(它属于Error,设计上就不该恢复)
错误信息要具体,能直接定位问题
别写 assert x > 0;,而要写:assert x > 0 : "x must be positive, got " + x + " in calculateTotal()";
消息里带上变量值、方法名、上下文,省去翻栈和重跑时间。
本质上,断言是写给自己的运行时注释:它不解决错误,只确保你不会忽略那些“理论上绝不可能发生,一旦发生就说明逻辑崩塌”的瞬间。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











