Java异常分Checked和Unchecked两类,前者继承Exception但非RuntimeException子类,如IOException,编译期强制处理;后者继承RuntimeException或Error,如NullPointerException,编译期不强制捕获,多因程序逻辑错误导致,应预防而非捕获。

Java中的异常分为两大类:Checked Exception(受检异常)和Unchecked Exception(非受检异常),它们的核心区别在于编译器是否强制要求处理或声明。
Checked Exception(受检异常)
这类异常在编译阶段就会被检查,程序必须显式处理,否则无法通过编译。
特点:- 继承自 Exception 类,但不包括 RuntimeException 及其子类。
- 常见例子:IOException、SQLException、ClassNotFoundException。
- 必须用 try-catch 捕获,或者在方法签名中使用 throws 声明抛出。
- 适用于那些程序可能恢复的外部问题,比如文件不存在、网络连接失败等。
例如,读取文件时必须处理 IOException:
try {
FileReader file = new FileReader("data.txt");
} catch (IOException e) {
System.out.println("文件读取失败:" + e.getMessage());
}
Unchecked Exception(非受检异常)
这类异常在编译阶段不会被强制检查,程序可以不处理也不会报错。
立即学习“Java免费学习笔记(深入)”;
特点:- 继承自 RuntimeException 或 Error。
- 常见例子:NullPointerException、ArrayIndexOutOfBoundsException、IllegalArgumentException。
- 通常由程序逻辑错误引起,应通过改进代码避免而不是捕获。
- 不需要强制 try-catch 或 throws 声明。
比如访问数组越界:
int[] arr = {1, 2, 3};
System.out.println(arr[5]); // 运行时报 ArrayIndexOutOfBoundsException
关键区别总结
- 编译检查:Checked 异常必须处理,Unchecked 不强制。
- 继承关系:Checked 继承 Exception(非运行时),Unchecked 通常是 RuntimeException 子类。
- 发生原因:Checked 多为外部可恢复错误;Unchecked 多为程序逻辑缺陷。
- 处理方式:Checked 推荐捕获并恢复;Unchecked 应该预防而非捕获。










