检查异常由调用者抛出,编译器强制处理,必须捕获或声明;运行时异常由jvm抛出,编译器不干预,应通过修复代码避免;前者用于可恢复的外部问题,后者反映不可恢复的逻辑错误。

回答这个问题,核心是讲清楚三点:谁抛的、编译器管不管、该不该(或能不能)恢复。
继承关系与分类本质
检查异常(Checked Exception)是 Exception 的子类,但不是 RuntimeException 的子类;运行时异常(Runtime Exception)则是 RuntimeException 的子类。这是最底层的区分依据,也是 Java 异常体系设计的起点。
- 检查异常代表外部可预期的、程序有能力恢复的问题,比如文件不存在、网络断开、数据库连接失败
- 运行时异常代表代码逻辑缺陷,比如空指针、数组越界、除零、类型强转错误
编译器是否强制处理
这是面试中最常被问到的实操区别:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 检查异常:编译器会报错,不处理(
try-catch)或不声明(throws)就过不了编译 - 运行时异常:编译器完全不管,写
int a = 1 / 0;也能顺利编译,运行时才崩溃
设计意图与使用场景
Java 这样区分,本质是告诉开发者“谁该负责”:
- 检查异常 → 调用者必须知情并决策:是重试?换路径?还是向上抛?它属于 API 合约的一部分
- 运行时异常 → 开发者自己该修代码:出现
NullPointerException不该靠 catch 来兜底,而应提前判空或重构逻辑 - 误用典型:把业务校验失败(如“余额不足”)扔成
RuntimeException,掩盖了本该由调用方处理的语义;或对NullPointerException做空catch,掩盖真正 bug
常见例子要能脱口而出
各列 3–4 个典型,避免只说名字,带一句触发原因更显理解:
- 检查异常:
IOException(读文件时磁盘坏了)、SQLException(SQL 语法错或连接超时)、ClassNotFoundException(反射加载类失败) - 运行时异常:
NullPointerException(调用了 null 对象的方法)、ArrayIndexOutOfBoundsException(访问arr[10]但数组长度只有 5)、ArithmeticException(除以零)、IllegalArgumentException(传了负数给“年龄”参数)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










