电话
400 9058 355
Exception 和 Error 是 Throwable 的两个平级子类,无继承关系;Exception 表示程序可处理的异常,应捕获或声明,Error 表示 JVM 严重错误,不应捕获而应快速终止。
Exception 和 Error 完全不是“轻重之分”,而是“能不能管”的根本区别— 
因为 Error(如 OutOfMemoryError、StackOverflowError)发生时,JVM 往往已处于不可信状态:线程栈可能损坏、内存分配失败、甚至日志输出都可能卡住。此时捕获它并继续执行业务逻辑,大概率引发更隐蔽的崩溃或数据错乱。
catch (StackOverflowError e) 后调用 System.out.println(),这个打印本身可能又触发一次栈溢出catch (OutOfMemoryError e) 之后试图 new 一个对象做“优雅降级”,结果直接 OOM 再次抛出SpringApplicationRunListener)或 APM 埋点中,才可捕获 Error 仅用于记录堆栈 + System.exit(1) 快速终止编译器只强制你管 Checked Exception(比如 IOException、SQLException),而 RuntimeException 子类(如 NullPointerException、IllegalArgumentException)虽能 catch,但真正靠谱的做法是提前预防。
FileNotFoundException:必须 try-catch 或 throws,否则编译不过NullPointerException:不强制捕获,应靠判空、Optional、断言等手段在源头规避try-catch (Exception e)——这会掩盖真实问题,且吞掉本该暴露的 RuntimeException
Exception 和 Error 是 Throwable 的两个平级子类,没有父子关系。这意味着:catch (Exception e) 永远捕获不到 OutOfMemoryError,哪怕你写了也白写。
try {
// 触发 OOM 的代码,例如不断创建大数组
List list = new ArrayList<>();
while (true) {
list.add(new byte[1024 * 1024]);
}
} catch (Exception e) {
// ❌ 这里进不来,OOM 是 Error,不是 Exception
System.err.println("caught exception");
} catch (Error e) {
// ✅ 只有这里能捕获,但如前所述,不该这么做
System.err.println("caught error: " + e);
} 所有业务异常都应该继承 Exception(检查型)或 RuntimeException(非检查型)。继承 Error 不仅语义错误,还会导致调用方完全无法感知——编译器不提醒,IDE 不提示,线上出了问题连告警都难触发。
class UserNotFoundException extends RuntimeException
class UserNotFoundException extends Error(这会让调用方误以为是 JVM 崩溃)最常被忽略的一点:很多团队把 NoClassDefFoundError 当成类没引入,其实它常是静态初始化块抛异常后的连锁反应——真正根因藏在 Throwable.getCause() 里,而 Error 通常没有有效 cause,查起来更费劲。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...