AssertionError表示程序逻辑错误,不应被常规捕获;它继承自Error,仅用于开发/测试阶段的内部契约检查,启用需JVM参数-ea,生产环境禁用,正确做法是修复逻辑或使用IllegalArgumentException等业务异常。

Java中的AssertionError不能也不应该被常规捕获和处理。
AssertionError的本质是程序逻辑错误,不是运行时异常
它继承自Error而非Exception,表示JVM检测到“本不该发生”的情况——比如断言失败(assert condition;中condition为false)。这说明代码逻辑存在缺陷,应修复问题本身,而不是掩盖它。
- 启用断言需加JVM参数:
-ea(或-enableassertions),默认关闭;生产环境通常禁用断言 - 断言只用于开发/测试阶段的内部契约检查(如方法入参合理性、中间状态校验),不适用于用户输入或外部依赖校验
- 捕获
AssertionError会模糊问题根源,让bug潜伏更久
不推荐但语法上可行的捕获方式(仅限特殊调试场景)
虽然不推荐,但Java语法允许你写:
try {
assert false : "触发断言";
} catch (AssertionError e) {
System.err.println("断言失败:" + e.getMessage());
}
⚠️ 注意:这段代码只有在JVM开启断言(-ea)时才会进入catch块;否则assert语句被忽略,不会抛异常。
立即学习“Java免费学习笔记(深入)”;
- 绝不应在生产代码中出现
catch(AssertionError) - 若真需要“失败后继续执行”,应改用
if (!condition) throw new IllegalArgumentException(...)等明确的业务异常
正确做法:用异常替代断言做可恢复的错误处理
对需要被调用方感知并处理的错误,应使用标准异常:
- 参数非法 →
IllegalArgumentException - 状态不满足前提 →
IllegalStateException - 资源不可用 →
IOException等受检/非受检异常 - 这些异常可被合理捕获、记录、重试或降级
基本上就这些。断言不是错误处理机制,而是开发者自检工具;出错了,优先看代码逻辑,而不是想着怎么“抓”住它。










