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. 调用者必须处理这个错误吗? → 是 → 编译时异常
相关推荐
BD_Marathon5 分钟前
Spring是什么
java·后端·spring
先做个垃圾出来………14 分钟前
创建Flask app应用对象
后端·python·flask
码界奇点17 分钟前
基于Spring Boot和Vue.js的房屋出租管理系统设计与实现
vue.js·spring boot·后端·车载系统·毕业设计·源代码管理
幽络源小助理37 分钟前
SpringBoot国内旅游景点数据爬虫与可视化分析系统源码 – JavaWeb项目分享
spring boot·后端·爬虫
ChineHe40 分钟前
Gin框架基础篇003_响应设置详解(状态码、头信息、多格式应答体)
后端·golang·gin
IT_陈寒1 小时前
Python性能调优实战:5个不报错但拖慢代码300%的隐藏陷阱(附解决方案)
前端·人工智能·后端
JaguarJack1 小时前
成为高级 PHP 开发者需要的思维转变
后端·php·服务端
BingoGo1 小时前
成为高级 PHP 开发者需要的思维转变
后端·php
悟能不能悟1 小时前
Spring HATEOAS 详细介绍
java·后端·spring
源代码•宸1 小时前
goframe框架签到系统项目开发(用户认证中间件、实现Refresh-token接口)
数据库·经验分享·后端·算法·中间件·跨域·refreshtoken