Java中异常分为Checked Exception和Unchecked Exception;2. Checked Exception在编译期强制处理,如IOException、SQLException,表示外部环境问题;3. Unchecked Exception包括RuntimeException及其子类,如NullPointerException,由程序逻辑错误引起,不强制捕获;4. Checked异常需try-catch或throws声明,Unchecked则不需要;5. 实际开发中,依赖外部资源时使用Checked,参数错误等场景使用Unchecked;6. 自定义异常时,继承Exception为受检,继承RuntimeException为非受检;7. 核心原则:Checked是必须处理的意外,Unchecked是本应避免的错误。

在Java中,异常是程序运行过程中可能出现的错误或意外情况。为了更好地处理这些异常,Java将异常分为两大类:Checked Exception(受检异常)和 Unchecked Exception(非受检异常)。理解它们的区别和使用场景,对编写健壮、可维护的代码非常重要。
什么是Checked Exception
Checked Exception是指在编译阶段就必须被显式处理的异常。这类异常通常表示程序外部可能发生的合理预期问题,比如文件找不到、网络连接失败等。Java要求开发者必须通过try-catch捕获,或者在方法签名中使用throws声明抛出。
常见例子包括:
- IOException:输入输出操作出错
- FileNotFoundException:尝试打开不存在的文件
- SQLException:数据库访问错误
由于编译器会强制检查这些异常是否被处理,因此得名“受检异常”。这有助于提醒开发者提前考虑潜在问题,提升程序的可靠性。
立即学习“Java免费学习笔记(深入)”;
什么是Unchecked Exception
Unchecked Exception包括RuntimeException及其子类,以及Error类型。它们不需要在方法签名中声明,也不强制要求捕获,因此称为“非受检异常”。
这类异常通常由程序逻辑错误引起,比如:
- NullPointerException:访问空对象的成员
- ArrayIndexOutOfBoundsException:数组下标越界
- IllegalArgumentException:传入非法参数
Unchecked Exception代表的是编程错误,理想情况下应在开发阶段就被发现并修复,而不是靠运行时捕获来应对。
两者的核心区别
可以从以下几个方面区分它们:
- 编译器检查:Checked异常必须处理,否则编译失败;Unchecked异常则不会影响编译
- 发生原因:Checked多为外部环境问题;Unchecked多为代码逻辑缺陷
- 处理方式:Checked建议显式捕获或声明;Unchecked通常不主动捕获,而是通过改进代码避免
- 继承关系:所有Checked异常都直接或间接继承自Exception但不是RuntimeException;Unchecked包括RuntimeException和Error
实际使用建议
在日常开发中,如何选择使用哪种异常也很关键:
- 如果你的方法依赖外部资源(如文件、网络、数据库),应使用Checked Exception,提醒调用者处理可能的失败
- 如果问题是由于调用方传递了错误参数或使用方式不当,应抛出Unchecked Exception,如IllegalArgumentException
- 不要滥用throws声明把所有异常都往上抛,应根据上下文决定在哪里捕获和处理
- 自定义异常时,若希望调用者必须处理,就继承Exception;若只是用于流程控制或表示编程错误,可继承RuntimeException
基本上就这些。理解这两类异常的本质,不仅能帮助你写出更规范的代码,也能更准确地设计错误处理机制。关键是记住:Checked是“必须处理的意外”,Unchecked是“本应避免的错误”。


