java编译器强制检查ioexception等checked异常,未处理则编译失败;而nullpointerexception等runtimeexception子类不检查,仅运行时抛出。

为什么编译器拦住 IOException 却放行 NullPointerException
因为 Java 在编译阶段就对两类异常做了硬性区分:只要方法里抛出 IOException、SQLException 这类 Checked 异常,而你既没用 try-catch 包住,也没在方法签名加 throws 声明,javac 立刻报错,拒绝生成 .class 文件。而 NullPointerException、ArrayIndexOutOfBoundsException 属于 RuntimeException 子类,编译器压根不查——能编译过,运行时才崩。
- Checked 异常 =
Exception的子类,但排除RuntimeException及其所有后代 - Unchecked 异常 =
RuntimeException+Error(如OutOfMemoryError)这两支 - 不是“要不要处理”的问题,是“编译器强制你表态”的机制设计
什么时候该用 throws IOException,什么时候直接 throw new IllegalArgumentException
关键看调用方能否合理恢复,以及错误源头是否可控。
- 对外提供 SDK 或公共 API 时,用 Checked 异常明确告知调用方:“这里可能失败,你得准备”,比如文件读写、数据库操作、HTTP 调用
- 内部工具类、DTO 转换、参数校验等纯内存操作,优先用 Unchecked 异常快速暴露逻辑缺陷,比如
new IllegalArgumentException("age must be > 0") - Checked 异常构造时通常带业务上下文(
new IOException("Failed to write to " + path)),而 Unchecked 更倾向简洁消息
捕获 Exception 代替具体异常类型会踩哪些坑
这不是懒,是埋雷。看似“兜住了”,实则掩盖了真实意图和可恢复性差异。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 用
catch (Exception e)会一并吞掉本该由上层处理的SQLException,也盖过了本该立刻修复的NullPointerException - 资源泄漏风险:如果在
catch (Exception e)里没做finally或try-with-resources,IOException可能导致流未关闭 - 日志难定位:统一 catch 后只打通用日志,丢失异常类型语义,排查时分不清是网络超时还是传了 null
- 正确做法是分层捕获:
catch (SQLException e)做重试或降级,catch (IllegalArgumentException e)直接返回 400,不混在一起
自定义异常该继承 Exception 还是 RuntimeException
别凭感觉,看它是否代表“调用方可预期并恢复”的失败场景。
- 如果下游调用者能通过重试、换路径、提示用户等方式应对,就继承
Exception(即 Checked),强制他决策 - 如果是参数非法、状态不一致、配置缺失等本不该发生的逻辑错误,就继承
RuntimeException(即 Unchecked),让他早发现、早修 - 注意:自定义 Checked 异常必须出现在方法签名中,否则编译不过;而自定义 Unchecked 异常可以随时抛,不用改接口
- 反例:为“用户名已存在”抛
UsernameExistException extends Exception—— 这本质是业务校验失败,应属 Unchecked,否则每个注册接口都得写throws,徒增噪声
最常被忽略的一点:Checked 异常本身没有性能开销,但用 try-catch 包裹高频正常流程(比如靠 NumberFormatException 判断字符串是否为数字来控制循环)会显著拖慢执行——异常机制本就不为常规路径设计。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










