Java异常体系以Throwable为根,分Error(不可恢复严重问题)和Exception(可恢复异常);Exception又分检查型(如IOException,编译器强制处理)和非检查型(RuntimeException及其子类,如NullPointerException,反映逻辑错误,应修复而非捕获)。

Java的异常体系以Throwable为根类,通过Exception和RuntimeException两条主线区分“可检查”与“不可检查”异常,核心设计目标是强制错误处理意识、明确责任边界、支持分层捕获。
Throwable是所有异常的顶层父类
Java中任何异常对象都必须直接或间接继承自Throwable。它有两个直接子类:Error和Exception。Error表示JVM无法恢复的严重问题(如OutOfMemoryError、StackOverflowError),通常不被捕获也不需处理;Exception则代表程序可预期、可恢复的异常情况,是开发者主要关注的对象。
Exception分为检查型异常(Checked)和非检查型异常(Unchecked)
Exception本身是检查型异常的基类,编译器要求调用者必须显式处理(try-catch或throws声明)。但它的子类RuntimeException被特别标记为非检查型——编译器不强制处理。这种划分基于一个关键判断:是否属于“程序逻辑错误”。
- 检查型异常(如IOException、SQLException):外部因素导致,程序本身无错,但必须应对(比如文件不存在、网络中断)
- 非检查型异常(如NullPointerException、ArrayIndexOutOfBoundsException):代码缺陷所致,应通过修复逻辑而非捕获来解决
RuntimeException的子类体现常见编程错误
RuntimeException及其子类几乎都反映开发阶段应发现的问题:
立即学习“Java免费学习笔记(深入)”;
- NullPointerException:访问null引用的成员
- ArrayIndexOutOfBoundsException:数组下标越界
- ClassCastException:非法类型转换
- IllegalArgumentException:方法传入非法参数(常由开发者主动throw)
这些异常在运行时抛出,不强制捕获,鼓励用防御性编程(如判空、校验范围)提前规避。
自定义异常应遵循继承规范
若需扩展异常语义,应根据用途选择父类:
- 需强制调用方处理(如业务规则违反且必须响应)→ 继承Exception
- 属编程错误或无需上层干预的运行时问题(如参数校验失败)→ 继承RuntimeException
无论哪种,都建议提供带String消息和Throwable cause的构造方法,便于日志追踪和链式异常封装。










