Java中Checked Exception是编译器强制处理的异常,用于显式暴露可预期、可恢复的系统风险,需通过throws声明、try-catch处理或向上抛出,适用外部依赖失败和强校验场景,不可用于编程错误。
java 中的 checked exception 是编译器强制要求处理的异常类型,用于显式暴露可预期、可恢复的系统风险(如 io 失败、网络超时、文件不存在等)。它的核心价值不在于“阻止错误发生”,而在于把风险契约写进方法签名,让调用方在编译期就无法忽视。
定义并抛出 Checked Exception
继承 Exception(但不继承 RuntimeException)的类即为 Checked Exception。自定义时需提供有意义的名称和构造函数:
- 声明异常:在方法签名中用 throws 明确列出可能抛出的 Checked Exception 类型
- 主动抛出:在业务逻辑中使用 throw new XxxException("原因") 触发异常
- 示例:public void readFile(String path) throws FileNotFoundException —— 编译器立刻要求调用方处理该风险
调用方必须显式处理:try-catch 或继续上抛
一旦方法声明了 Checked Exception,所有直接调用它的地方都会触发编译错误,除非满足以下任一条件:
- try-catch 捕获并处理:在当前作用域内消化风险(如重试、降级、记录日志、转换为用户友好的提示)
- throws 向上声明:将风险责任移交上层,但必须同步更新本方法签名,形成清晰的风险传递链
- 不可省略、不可忽略——这是编译器级的契约约束,不是运行时提醒
设计原则:只对可预期且调用方可干预的风险用 Checked Exception
滥用会导致代码臃肿或掩盖真正问题。适用场景有明确边界:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 外部依赖失败:如 IOException(读写文件/网络)、SQLException(数据库操作)
- 业务规则强校验失败:如支付前检查余额不足,可定义 InsufficientBalanceException 并要求调用方提前判断或兜底
- 避免用于编程错误(如空指针、数组越界)或不可恢复的系统崩溃(如内存溢出),这些应归为 RuntimeException
配合异常语义分层,提升可维护性
单一异常类型难以表达不同风险等级。建议构建轻量分层:
- 顶层自定义基类(如 SystemRiskException extends Exception)统一标识“需关注的系统风险”
- 子类按场景细化(NetworkTimeoutException、ConfigLoadFailureException),便于针对性处理
- 在 catch 块中可根据具体子类执行不同策略,而非仅靠字符串匹配
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










