JavaSE-异常-异常体系

35 阅读1分钟

💡导读

1、异常体系结构 -- Throwable家族的层次关系

2、Checked vs Unchecked异常 —— 核心区别与处理原则

1、异常体系结构

graph TD
    Throwable --> Error
    Throwable --> Exception
    Exception --> RuntimeException
    Exception --> 其他Exception

详细说明

Java异常体系以Throwable为根,Error代表系统级故障,Exception分为RuntimeException(非检查)和其他Exception子类(检查)——这个设计让编译器能智能判断哪些错误必须处理。

1. Throwable(根类)

  • 所有异常和错误的唯一超类
  • 包含异常消息、堆栈跟踪等核心信息

2. 两大分支

分支特点处理原则典型异常
ErrorJVM系统级错误不捕获,应用无法恢复OutOfMemoryError, StackOverflowError
Exception程序级异常根据类型决定是否处理见下表

3. Exception的子分类

子分类判断标准是否强制处理典型异常
RuntimeException继承RuntimeException❌ 不强制NullPointerException, ArrayIndexOutOfBoundsException
其他Exception子类继承Exception但不继承RuntimeException✅ 强制IOException, SQLException, ClassNotFoundException

2、Checked vs Unchecked

What

  • checked异常 : 继承Exception但不继承RuntimeException, 必须显式处理(try-catch或throws)
  • Unchecked异常 :继承RuntimeException,修复代码,避免发生,通常不捕获

How

// ✅ Checked异常:编译器强制处理
public void readFile(String path) throws IOException {
    // 必须try-catch或声明throws
    // 编译器报错:Unhandled exception: java.io.IOException
    FileReader reader = new FileReader(path);
}

// ✅ Unchecked异常:编译器不强制
public void process(String text) {
    // 编译通过,运行时可能抛NullPointerException
    if (text.length() > 10) { ... }
}

Why

Java异常体系是类型系统的延伸——通过继承关系实现编译时契约(Checked Exception)与运行时哨兵(Unchecked Exception)的平衡,让开发者在安全与性能之间找到最佳实践点。