AssertionError表示程序逻辑错误,不应被常规捕获;它继承自Error,仅用于开发/测试阶段的内部契约检查,启用需JVM参数-ea,生产环境禁用,正确做法是修复逻辑或使用IllegalArgumentException等业务异常。
Java中的AssertionError不能也不应该被常规捕获和处理。
它继承自Error而非Exception,表示JVM检测到“本不该发生”的情况——比如断言失败(assert condition;中condition为false)。这说明代码逻辑存在缺陷,应修复问题本身,而不是掩盖它。
-ea(或-enableassertions),默认关闭;生产环境通常禁用断言AssertionError会模糊问题根源,让bug潜伏更久
虽然不推荐,但Java语法允许你写:
try {
assert false : "触发断言";
} catch (AssertionError e) {
System.err.println("断言失败:" + e.getMessage());
}
⚠️ 注意:这段代码只有在JVM开启断言(-ea)时才会进入catch块;否则assert语句被忽略,不会抛异常。
catch(AssertionError)
if (!condition) throw new IllegalArgumentException(...)等明确的业务异常对需要被调用方感知并处理的错误,应使用标准异常:
IllegalArgumentException
IllegalStateException
IOException等受检/非受检异常基本上就这些。断言不是错误处理机制,而是开发者自检工具;出错了,优先看代码逻辑,而不是想着怎么“抓”住它。