写代码的时候,谁还没踩过数组越界的坑?明明逻辑没问题,一运行就报错,定位半天才发现是索引出了问题。数组索引异常在日常开发中太常见了,尤其在处理用户输入、动态数据或循环遍历时,稍不注意就会触发。
常见的异常场景
比如从网页表单读取一组成绩,存进数组计算平均分。用户可能只填了3个,但程序误以为有5个,循环到第4个时,arr[4] 就越界了。Java 会抛出 ArrayIndexOutOfBoundsException,Python 则是 IndexError,直接中断执行。
另一个典型例子是字符串处理。想取字符串倒数第二个字符,用了 s[s.length - 2],但如果字符串长度只有1,length - 2 就是-1,索引为负,照样报错。
怎么提前预防
最简单的办法就是在访问前加判断。以 Java 为例:
int[] scores = {85, 90, 78};
int index = 3;
if (index >= 0 && index < scores.length) {
System.out.println(scores[index]);
} else {
System.out.println("索引超出范围");
}
Python 虽然支持负索引,但也不能乱来。比如列表只有3项,list[-5] 依然会报错。稳妥的做法是先确认长度:
data = [10, 20, 30]
index = -5
if -len(data) <= index < len(data):
print(data[index])
else:
print("索引无效")
利用语言特性简化处理
有些语言提供了更安全的访问方式。比如 C# 中可以用 TryGet 模式,不抛异常而是返回布尔值。JavaScript 里访问不存在的数组元素不会崩溃,只是返回 undefined,但后续操作要小心别带出 NaN 或其他奇怪结果。
在需要频繁操作的场景,封装一个安全获取函数会省事很多:
public static <T> T safeGet(T[] arr, int index) {
if (arr == null || index < 0 || index >= arr.length) {
return null;
}
return arr[index];
}
调试时的小技巧
遇到索引异常,别急着改代码。先打印数组长度和你要访问的索引值,一眼就能看出是不是差了一位。很多人犯的错都是“以为”索引合法,其实循环变量算错了。加上日志输出,比打断点还快。
另外,单元测试里多覆盖边界情况:空数组、只有一个元素、访问首尾位置。这些用例写好了,以后重构也不怕踩雷。