💡导读
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. 两大分支
| 分支 | 特点 | 处理原则 | 典型异常 |
|---|---|---|---|
| Error | JVM系统级错误 | 不捕获,应用无法恢复 | 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)的平衡,让开发者在安全与性能之间找到最佳实践点。