索引超出了数组界限解决方法

说实话,当我开始编程时,越界的东西真是烦死了。
记得曾经写过一个学生成绩统计的小程序。
正因为如此,因为循环条件写错了,所以每次都多算了一名学生,导致最后的总分直接爆炸了2 00多分。
那是我第一次遇到“索引超出数组限制”的事情。
因此,这个问题应该慎重考虑。

首先我们来谈谈检查数组定义和初始化。
在我最近的一个旧项目中,有一个地方定义了长度为8 的数组,但代码实际上访问的是第9 个元素。
这显然是由于最初开发过程中的失误造成的。
如果测试人员不是每天带着有限的数据四处走动,这个错误可能会被永远埋葬。
确切地说,一开始就应该多加注意,尤其是对于固定长度的谈判。
最好在代码中写下注释,如“注意:索引范围0-7 ”。

有趣的是评估循环条件的方法。
在编写 for 循环时,我总是写 i < array>为什么?因为数组是从0开始计数的!例如,在长度为 1 0 的数组中,最后一个元素的索引为 9 如果写入 i <= 9 ,则会意外访问未分配的内存。
我在给实习生讲课时突然意识到这一点。
那一刻,当我看到ArrayIndexOutOfBoundsException在屏幕上爆炸时,我感觉我的逻辑可以绕地球三圈。

在动态调整数组大小时,我在 Java 中使用了 ArrayList。
当你要频繁添加或删除元素时,这非常方便,但需要注意扩展方法。
我记得有一个项目需要实时处理传感器数据。
我直接使用ArrayList来存储数据。
结果,随着数据量的增加,频繁的扩容操作直接导致系统速度变慢。
这是我第一次了解到“产能增长战略”。
后来采用数组+手动扩容的方式解决了。
我个人不会在这个环境下运行C++向量,但我觉得原理应该是一样的。

我还遇到了特殊的处理问题。
有一次我写了一个配置读取工具并且索引是正确的我直接用它来决定。
在考试过程中,我发现在一些困难的情况下会失去决心。
后来就用了try-catch。
虽然性能稍差,但至少程序不会因为运行越界而自动崩溃。
我更喜欢在捕获异常后记录详细的日志,这对于识别问题特别方便。
某个模块的ArrayIndexOutOfBoundsException日志非常模糊,以至于我记得半夜被微信消息吵醒。

最后,我们来谈谈调试和测试。
我有一个特别有效的技巧,就是利用IDE的调试功能单步执行,每次到数组就暂停,直接看内存值。
有一次,当我编辑旧代码库时,我使用这种方法发现了一个隐藏了三年的错误——特定循环的计数器变成了局部变量,每次调用都返回最终结果。
当我看着计数器从1 数到1 00时,我以为我正在引爆炸弹。

其实,州外问题最可怕的是“我以为别人会证明这一点”。
我的一个同事总是说“Java会自动完成”,但正因为如此,他基于第三方库编写了一个模块,而该库直接发现了超出范围的内存——这很遗憾。
所以现在我们团队有一个规则,所有的准入谈判都必须受到约束。
在代码审查期间检查此区域。
说实话,可能有点极端,但省去了很多麻烦。

我记得的数据来自一些测试统计。
我们的系统每天处理大约 2 00 万次交易访问,其中大约 0.01 % 触发边境检查。
这个比例看似不大,但对于实际用户来说却不容忽视。
当时我并没有意识到这0.01 %造成了多大的麻烦,但我知道这可能是让手术和维修同事一晚上抓狂的罪魁祸首。

我个人没有在这个环境下运行过C++ Vector,但是感觉原理应该是一样的。
我记得数据来自一些测试统计。
我们的系统每天处理大约 2 00 万次阵列访问,大约 0.01 % 触发边界检查。
这这个比例看似不大,但对于实际用户来说却不容忽视。
当时我并没有意识到这0.01 %造成了多大的麻烦,但我知道这可能是让手术和维修同事一晚上抓狂的罪魁祸首。

数组索引越界异常

数组索引越界报错“Index 10 out of bounds for length 10”,如何有效解决?