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:系统崩了,代码管不了;
- 运行时异常:代码逻辑错了,可处理可不处理;
- 编译时异常 :外部环境问题,必须处理。