runtimeexception本身不直接影响性能,但不当使用会显著拖慢程序——关键不在“抛不抛”,而在“何时抛、为何抛、怎么防”。高频路径中创建异常对象、填充堆栈、触发jvm解析,开销远高于普通判断或返回值。真正影响性能的,是把运行时异常当作流程控制手段,或在循环、解析、序列化等热点代码里反复触发。避免在高频路径中抛出runtimeexception异常对象构造成本高:每次new runtimeexception()都会采集完整堆栈,耗时可达普通对象创建的10倍以上。在日志解析、json反序列化、协议解包等每秒调用成千上万次的场景中,应禁用“先抛再捕”模式。 ❌ 错误做法:直接调用integer.parseint(str),靠catch numberformatexception处理非法输入 ✅ 推荐做法:先用str.chars().allmatch(character::isdigit)或正则预判,合法再解析;或使用ints.tryparse(str)(guava)等返回null/optional的轻量方法 ✅ 批量处理时:对单条记录异常做标记跳过,不中断整个批次,避免反复进出异常处理机制用防御性编程替代被动捕获大多数runtimeexception(如nullpointerexception、arrayindexoutofboundsexception、illegalargumentexception)本质是可预防的逻辑漏洞。与其在运行时兜底,不如在

RuntimeException本身不直接影响性能,但不当使用会显著拖慢程序——关键不在“抛不抛”,而在“何时抛、为何抛、怎么防”。高频路径中创建异常对象、填充堆栈、触发JVM解析,开销远高于普通判断或返回值。真正影响性能的,是把运行时异常当作流程控制手段,或在循环、解析、序列化等热点代码里反复触发。
避免在高频路径中抛出RuntimeException
异常对象构造成本高:每次new RuntimeException()都会采集完整堆栈,耗时可达普通对象创建的10倍以上。在日志解析、JSON反序列化、协议解包等每秒调用成千上万次的场景中,应禁用“先抛再捕”模式。
- ❌ 错误做法:直接调用
Integer.parseInt(str),靠catch NumberFormatException处理非法输入 - ✅ 推荐做法:先用
str.chars().allMatch(Character::isDigit)或正则预判,合法再解析;或使用Ints.tryParse(str)(Guava)等返回null/Optional的轻量方法 - ✅ 批量处理时:对单条记录异常做标记跳过,不中断整个批次,避免反复进出异常处理机制
用防御性编程替代被动捕获
大多数RuntimeException(如NullPointerException、ArrayIndexOutOfBoundsException、IllegalArgumentException)本质是可预防的逻辑漏洞。与其在运行时兜底,不如在入口和关键节点主动拦截。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 参数校验优先:方法开头用
Objects.requireNonNull(param, "param must not be null"),失败立即抛出明确异常,且只发生一次 - 集合操作前检查:
if (map.containsKey(key)) { ... }比try { map.get(key).toString(); } catch (NullPointerException e) { ... }更快更清晰 - 数组/列表访问加边界判断:
if (i >= 0 && i ,而非依赖索引越界后抛出异常
自定义RuntimeException需兼顾语义与轻量
业务异常如InsufficientBalanceException或InvalidOrderStateException应继承RuntimeException,但要控制构造开销:
- 避免在构造函数中做耗时操作(如远程调用、日志写入)
- 不重写
fillInStackTrace()除非有特殊需求——默认行为已足够,禁用它虽能提速,但会丢失关键调试信息,得不偿失 - 推荐提供带错误码、消息、可选原因的构造器,便于统一日志和监控,但不要为每个异常实例都拼接长字符串上下文
全局兜底不等于放任异常发生
即使配置了@RestControllerAdvice统一捕获所有RuntimeException,也不能放松前置校验。因为:
- 全局处理器本身也是执行路径,频繁进入会增加GC压力和响应延迟
- 敏感操作(如扣款、删库)一旦因未校验导致异常,全局兜底无法还原已发生的副作用
- 异常堆栈在传播过程中可能被截断或脱敏,原始根因反而更难定位
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










