一、一句话区分
- 运行时异常 :
extends RuntimeException- 不强制处理,程序逻辑错误 - 编译时异常 :
extends Exception- 必须处理,外部依赖问题
二、核心代码对比
运行时异常
java
// 定义
class MyRuntimeException extends RuntimeException {
MyRuntimeException(String msg) { super(msg); }
}
// 使用(可不处理)
void method() {
throw new MyRuntimeException("错误"); // ✅ 不会强制要求try-catch
}
编译时异常
java
// 定义
class MyCheckedException extends Exception {
MyCheckedException(String msg) { super(msg); }
}
// 使用(必须处理)
void method() throws MyCheckedException { // ✅ 必须声明
throw new MyCheckedException("错误");
}
三、选择原则
用运行时异常的场景:
- 参数错误 - 调用者传参有误
- 状态非法 - 程序状态不对
- 业务规则违反 - 业务逻辑不允许
java
// 例子:用户年龄不能为负数
if (age < 0) {
throw new IllegalArgumentException("年龄不能为负");
}
用编译时异常的场景:
- 文件/网络IO - 外部资源可能失败
- 数据库操作 - 数据库可能连不上
- 第三方API调用 - 外部服务可能失败
java
// 例子:读取文件(文件可能不存在)
public String readFile(String path) throws IOException {
// 必须处理可能出现的IO异常
}
四、简单记忆
- 运行时异常 → 程序员的错 → 改代码解决
- 编译时异常 → 外部世界的错 → 必须处理可能发生的问题
五、最佳实践
java
// 运行时异常:业务异常
class BusinessException extends RuntimeException {
BusinessException(String msg) { super(msg); }
}
// 编译时异常:系统异常
class SystemException extends Exception {
SystemException(String msg) { super(msg); }
}
使用决策流程:
- 错误是调用者能避免的吗? → 是 → 运行时异常
- 错误是外部依赖导致的吗? → 是 → 编译时异常
- 调用者必须处理这个错误吗? → 是 → 编译时异常