Exception和Error本质不同:Exception是程序可预判、可干预的异常,分检查型(如IOException)和非检查型(如NullPointerException);Error是JVM严重故障(如OutOfMemoryError),不可恢复,不应捕获处理。

Java里Exception和Error根本不是一回事,不能混着用,也不能都拿try-catch去抓。
Exception是程序能管的事
它代表运行中可能出问题、但程序自己能应对的情况。比如文件打不开、数据库连不上、数组下标越界、对象是null还调方法——这些都属于Exception。
它又分两类:
- 检查异常(Checked Exception):像IOException、SQLException,编译器盯得紧,不处理就过不了编译。必须用try-catch包住,或者在方法上加throws声明。
- 非检查异常(Unchecked Exception):主要是RuntimeException及其子类,比如NullPointerException、ArrayIndexOutOfBoundsException。编译器不管,但写代码时该避免就避免,真出了也能捕获,只是不强制。
Error是程序管不了的事
它代表JVM层面的严重故障,比如内存彻底耗尽(OutOfMemoryError)、递归太深把栈压爆了(StackOverflowError)、类加载失败(NoClassDefFoundError)。这些问题一发生,JVM自身已经不稳定,程序基本没法继续跑。
立即学习“Java免费学习笔记(深入)”;
所以:
- 别写catch(Error e)来“兜底”,捕获了也做不了什么有用操作。
- 更不要试图靠catch之后继续执行业务逻辑——大概率会出更奇怪的问题。
- 真正该做的是排查根源:调优内存参数、修复无限递归、检查类路径或依赖版本。
继承关系和设计意图很清晰
Exception和Error都直接继承自Throwable,但设计目的完全不同:
- Exception是给开发者用的,意味着“这事可以预判、可以干预、可以恢复”。
- Error是给JVM用的,意思是“系统撑不住了,快停吧”。
- 自定义异常永远该继承Exception或RuntimeException,绝不能继承Error。
基本上就这些。关键不在语法细节,而在于理解:Exception是程序里的小意外,Error是地基塌了。








