Spring WebFlux 核心解析:Reactor 编程与 Netty 服务器实践
拆解 Spring WebFlux 编程模型与服务器实践,从 Reactor 数据类型到 Netty 集成,用真实代码聊聊响应式开发的要点。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-08-05 12:00:38 Java ArrayIndexOutOfBoundsException 异常处理
线上跑得好好的服务突然开始频繁报警,点开一看全是 ArrayIndexOutOfBoundsException,报错信息大致是这样:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
这种异常 Java 程序员基本都见过,但隔段时间还是会写出来,特别是逻辑稍微复杂一点的循环或者索引被传来传去的时候。
报错信息已经把原因说得很清楚了:数组长度是5,有效索引范围只能是 0 到 4,代码里却拿索引 5 去访问,自然就炸了。
实际碰到的场景里,多数不是直接写死一个 array[5] 这么明显。
常见的是循环边界写错,比如本来应该 i < array.length,结果写成了 i <= array.length,最后一个迭代就越界了。还有一种是从外部传进来一个索引值,上游没校验,这边直接用了;再就是某个计算逻辑推导出来的索引,自以为肯定在范围内,结果边界条件没覆盖到。
排查的时候,可以先定位到抛出异常的那一行,往前看索引值是怎么生成的。很多时候变量名称是 index、pos 之类,顺着赋值链路查下去,很快能发现是哪里没卡住边界。IDE 里打断点,单步跑一遍,观察数组长度和索引值的变化,通常比一行行看代码快。
处理方式上,最直接的就是在访问数组前加一段边界检查:
if (index >= 0 && index < array.length) {
System.out.println(array[index]);
} else {
System.out.println("索引越界!");
}
这样即便上游扔过来一个离谱的值,也不会让整个线程崩掉,该记日志记日志,该降级降级。
有人会觉得到处写 if 太啰嗦,可以抽一个工具方法,比如 safeGet(array, index, defaultValue),内部做检查,用起来顺手一些。不过要注意,大量循环里频繁调用这种安全方法会有性能开销,得看场景权衡。
另外,尽量避免硬编码索引。数组长度 5,就直接写索引 4 去拿最后一个元素,过几天数组长度变了,代码没改,又崩了。用 array[array.length - 1] 虽然长一点,但不会出错。
如果是遍历,直接上增强 for 循环会更省事,编译器帮你处理边界。
触发异常的代码很简单,就是一个典型的越界访问:
public class ArrayDemo {
public static void main(String[] args) {
int[] array = new int[5];
System.out.println(array[5]);
}
}
这里数组初始化后,array[5] 直接指向了不存在的第六个元素,运行必抛异常。
修正后加上边界检查,把索引放在 if 里保护起来:
public class ArrayDemo {
public static void main(String[] args) {
int[] array = new int[5];
int index = 5;
if (index >= 0 && index < array.length) {
System.out.println(array[index]);
} else {
System.out.println("索引越界,无法访问数组元素!");
}
}
}
这个例子里的 index 还是硬编码的 5,只是为了演示。
实际项目里,index 可能是从请求参数、消息体或者计算结果里来的,核心就是在使用前多一步判断,别让一个越界把整个请求链路打挂。
说到底,ArrayIndexOutOfBoundsException 不是什么复杂问题,但它很容易在边界条件和参数组合没覆盖全的时候冒出来。
写的时候多留一点余量,上线之后半夜被报警叫起来的情况就能少不少。
拆解 Spring WebFlux 编程模型与服务器实践,从 Reactor 数据类型到 Netty 集成,用真实代码聊聊响应式开发的要点。
记录用 WireMock 挡服务时,通过 JSON 映射文件和 Java API 做请求头匹配、响应头与响应体配置的两种方式及细节。
记录一次排序 NPE 的排查和解决,顺便说下 IDEA 调试集合时 null 元素不显示的问题怎么调整。
记录一次排序 NPE 的排查和解决,顺便说下 IDEA 调试集合时 null 元素不显示的问题怎么调整。