throwable是java异常体系的根类,所有异常对象必须继承它;其子类error表示不可恢复的系统错误,exception表示可处理的异常,后者再分为编译期检查异常和运行时异常。

Throwable 是 Java 异常机制的起点,不是用来直接抛出或捕获的“工具类”,而是所有能被 throw 或 catch 的对象必须满足的“身份门槛”——只有它的实例(或其子类实例),JVM 才认可为合法的异常对象。
Throwable 是异常体系的“法律依据”
它定义了异常最基本的特征和能力:比如携带错误消息(getMessage())、记录调用链路(printStackTrace())、支持异常嵌套(getCause())。没有继承 Throwable,哪怕逻辑再像异常,也不能参与 Java 的异常处理流程。
- 就像身份证是办理银行、乘车、入住的前提,Throwable 是成为“可抛异常”的前提
- 你不能写
throw new Object(),因为 Object 不是 Throwable 的子类 - 自定义异常时,必须写
class MyException extends Exception(而 Exception 继承自 Throwable)
它的两个直系子类分工明确
Throwable 不自己干活,而是把责任分给两个“执行分支”:
-
Error:代表程序不该、也不能处理的问题,比如
OutOfMemoryError。它不是 bug,而是环境崩溃信号。捕获它通常没意义,更不该尝试恢复 -
Exception:代表程序“本可以应对”的意外,比如文件不存在(
FileNotFoundException)、网络超时(SocketTimeoutException)。这部分才是 try-catch、throws、事务回滚真正作用的对象
区分 checked 和 unchecked 就在 Exception 下一层
Exception 还进一步划出边界:
- 编译期强制检查的异常(如
IOException),必须显式处理,否则编译失败 - RuntimeException 及其子类(如
NullPointerException、IllegalArgumentException),编译器不管,但运行时照样中断流程 - 这个区别不影响 Throwable 的地位——它们都是 Throwable 的合法后代,只是编译器对其中一部分“提前干预”而已
事务回滚等框架行为依赖 Throwable 的分类逻辑
比如 Spring 的 @Transactional(rollbackFor = Exception.class),本质就是告诉框架:“只要抛出的是 Exception 或其任意子类(包括 RuntimeException),就回滚”。它不会响应 Error,也不会响应非 Throwable 类型对象——因为框架底层靠的就是 instanceof Throwable 判断是否“算异常”。
- 如果误把
rollbackFor = Throwable.class,会导致 OutOfMemoryError 也触发回滚——这毫无意义,甚至干扰 JVM 自身错误处理 - 若只写
rollbackFor = RuntimeException.class,那 IOException 就不会回滚,可能留下脏数据
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











