Java 异常分类
Java 异常的核心分类是三大类,基于继承关系(都继承自Throwable顶层父类)划分,同时也分为受检异常和非受检异常两种处理机制,这是开发中最常用的划分方式。
一、顶层父类:Throwable
所有异常和错误的根类,只有它的子类才能被 JVM 识别为可抛出对象。
两个直接子类:
- Error(错误)
- Exception(异常)
二、核心三大分类
1. Error(错误)
- 定义:JVM 层面的严重系统错误,程序无法处理、无法恢复。
- 特点:
- 代码无需捕获/抛出,捕获了也没用;
- 由 JVM 自动抛出,一旦发生程序大概率崩溃。
- 常见例子:
StackOverflowError:栈溢出(递归死循环)OutOfMemoryError:内存溢出(OOM)NoClassDefFoundError:类找不到
2. 运行时异常(RuntimeException)
- 定义:程序运行期间才会触发的逻辑错误,属于非受检异常。
- 特点:
- 代码不强制要求捕获/处理;
- 由代码逻辑问题导致(空指针、数组越界等)。
- 常见例子:
NullPointerException:空指针异常IndexOutOfBoundsException:数组/集合越界IllegalArgumentException:参数不合法ClassCastException:类型转换异常
3. 编译时异常(受检异常 Checked Exception)
- 定义:编译阶段就必须处理的异常,属于受检异常。
- 特点:
- 编译器强制要求捕获(try-catch)或声明抛出(throws);
- 通常是外部环境问题(文件、网络、数据库等)。
- 常见例子:
IOException:IO 流异常(文件读写失败)SQLException:数据库操作异常FileNotFoundException:文件找不到ClassNotFoundException:类加载失败
三、两种处理机制分类(开发重点)
| 类型 | 包含 | 处理要求 | 触发时机 |
|---|---|---|---|
| 非受检异常 | Error + 运行时异常 | 不强制处理 | 运行时 |
| 受检异常 | 除运行时外的所有 Exception | 编译器强制处理 | 编译时 |
四、完整继承关系图
Throwable ├── Error(错误,JVM 崩溃级,不处理) └── Exception(异常,程序可处理) ├── RuntimeException(运行时异常,非受检) │ ├── NullPointerException │ ├── IndexOutOfBoundsException │ └── ... └── 编译时异常(受检异常) ├── IOException ├── SQLException └── ...总结
- Error:系统崩了,代码管不了;
- 运行时异常:代码逻辑错了,可处理可不处理;
- 编译时异常:外部环境问题,必须处理。
