java异常体系以throwable为根,分为error(jvm严重问题,不捕获)和exception;后者再分runtimeexception(非受检,重在预防)和受检异常(必须try-catch或throws)。

Java 异常体系以 Throwable 为唯一顶层根类,所有错误和异常都直接或间接继承自它。它的分层非常清晰,不是扁平罗列,而是有明确语义分工的两级主干 + 细化分支。
Throwable 的两大主干分支
-
Error:JVM 层面的严重问题,程序无法处理 -
Exception:程序运行中可预期、可干预的非正常情况
这两类在设计上就划清了“该不该写 try-catch”的边界。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
Error 分支不需编码处理
代表系统级崩溃风险,比如:
-
OutOfMemoryError:堆内存耗尽,靠加-Xmx或优化对象生命周期解决 -
StackOverflowError:递归无终止,靠修正逻辑而非捕获 -
NoClassDefFoundError:运行时类缺失,属部署/依赖问题,不是代码能 catch 住的
这类错误一旦发生,JVM 往往已处于不稳定状态,强行捕获不仅无效,还可能掩盖真正的问题根源。
Exception 分支是开发者主战场
它进一步按编译器是否强制检查,分为两类:
-
受检异常(Checked Exception)
编译期就必须显式处理,否则编译失败。典型如:-
IOException(文件读写、网络通信) -
SQLException(数据库操作) -
ClassNotFoundException(反射加载类失败)
处理方式只能是try-catch捕获,或用throws向上声明。
-
-
非受检异常(Unchecked Exception)
继承自RuntimeException,编译器不管,运行时才暴露。典型如:-
NullPointerException(访问 null 引用) -
ArrayIndexOutOfBoundsException(数组越界) -
IllegalArgumentException(传入非法参数)
它们反映的是程序逻辑缺陷,应通过代码审查、空值校验、边界判断来预防,而不是依赖catch补救。
-
整个结构可简化为:
Throwable
├── Error(不捕获、不声明、不处理)
└── Exception
├── RuntimeException(非受检,重在预防)
└── 其他 Exception(受检,必须处理)Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










