Java 自定义异常

一、一句话区分

  • 运行时异常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("错误");
}

三、选择原则

用运行时异常的场景:

  1. 参数错误 - 调用者传参有误
  2. 状态非法 - 程序状态不对
  3. 业务规则违反 - 业务逻辑不允许
java 复制代码
// 例子:用户年龄不能为负数
if (age < 0) {
    throw new IllegalArgumentException("年龄不能为负");
}

用编译时异常的场景:

  1. 文件/网络IO - 外部资源可能失败
  2. 数据库操作 - 数据库可能连不上
  3. 第三方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); }
}

使用决策流程:

  1. 错误是调用者能避免的吗? → 是 → 运行时异常
  2. 错误是外部依赖导致的吗? → 是 → 编译时异常
  3. 调用者必须处理这个错误吗? → 是 → 编译时异常
相关推荐
lazy H4 小时前
从入门到日常开发,一篇文章掌握 Git 核心操作
git·后端·学习·github
GetcharZp12 小时前
抛弃低效SSH!这套Ansible+Web可视化神器,让你天天准点下班!
后端
weixin_4462608515 小时前
HACO:面向动态部署环境的对冲式智能计算可靠多智能体调度框架
后端·python·flask
ttwuai16 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
用户83562907805116 小时前
Python 实现 Excel 页面布局与打印设置自动化
后端·python
用户99314415798416 小时前
微服务框架中获取用户信息
后端
xuanWb17 小时前
手写一个 LLM API 网关:Anthropic 与 OpenAI 协议转换的完整实现
后端
苍何17 小时前
给 Codex 换皮肤这门生意,被我开源了
后端
用户83562907805117 小时前
Python 实现 Excel 命名范围(Named Range)的创建与管理
后端·python