我就是奇迹

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

对比 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。

 

posted on 2025-05-05 23:17  我就是奇迹  阅读(23)  评论(0)    收藏  举报