对比 Error 与 Exception
这是 Java 面试中的高频问题之一,让我们来系统对比 Error 与 Exception 的区别:
✅ 一、简洁定义
|
类型 |
定义 |
是否可处理 |
|---|---|---|
|
Exception |
表示程序运行期间出现的可预期异常,程序通常可以捕获并恢复 |
✅ 通常可以 try-catch |
|
Error |
表示JVM 层级的严重错误,如内存溢出,程序无法恢复 |
❌ 通常不能/不建议处理 |
✅ 二、继承结构(重点)
java.lang.Throwable
├── java.lang.Error ← 系统级错误(不可恢复)
└── java.lang.Exception ← 应用程序级异常(可恢复)
✅ 三、进一步分类对比
|
类别 |
示例 |
是否需开发处理 |
|---|---|---|
|
Error |
OutOfMemoryError, StackOverflowError, NoClassDefFoundError |
❌ 不建议处理;通常程序无法继续 |
|
Checked Exception(受检异常) |
IOException, SQLException, ParseException |
✅ 编译时强制处理(必须 try-catch 或 throws) |
|
Unchecked Exception(运行时异常) |
NullPointerException, IndexOutOfBoundsException, IllegalArgumentException |
✅ 可选处理,但必须注意业务逻辑健壮性 |
✅ 四、示意图结构
Throwable
├── Exception
│ ├── Checked Exception → 编译器强制处理
│ └── RuntimeException → 程序运行出错
└── Error → JVM/系统崩溃类错误
✅ 五、是否该 catch
Error
?
不建议:
try {
// risky code
} catch (Error e) {
// ❌ 不推荐这么做,除非日志记录或特殊容灾需求
}
因为:
-
Error 表示系统已经进入“不稳定”状态(如内存溢出)
-
捕获 Error 并不能保证系统真的能恢复
✅ 六、举个真实对比例子
public class TestErrorException {
public static void main(String[] args) {
try {
// Exception 示例
String s = null;
System.out.println(s.length()); // NullPointerException
} catch (Exception e) {
System.out.println("处理了 Exception");
}
// Error 示例(不 catch 会直接崩)
// StackOverflowError
recursive();
}
public static void recursive() {
recursive();
}
}
✅ 总结一句话:
Exception 表示应用层可恢复的问题,Error 表示 JVM 层不可恢复的严重错误。程序应该关注处理 Exception,而不是试图捕获 Error。
浙公网安备 33010602011771号