Java实现区间提取功能报Index 20 out of bounds for length 20异常如何解决
问题原因分析
- 核心越界点在内层
while循环的判断条件:你没有对访问的数组索引做边界校验,当连续序列延伸到数组最后一个元素时,arr[i+j+1]会访问到arr[arr.length],数组索引从0开始,长度为20的数组最大合法索引是19,访问索引20就会抛出你遇到的越界异常。对应你的测试用例,当i=16时,j增加到3后,i+j+1=20刚好等于数组长度,此时触发越界。 - 外层if判断也存在隐藏的越界风险:当i走到数组最后一个索引时,
arr[i+1]同样会访问非法索引,只是你的测试用例中提前在内层循环触发了异常,所以没暴露这个问题。
修正方案
需要做两处核心改动,另有一处可选性能优化:
- 外层if判断增加边界校验,只有
i+1 < arr.length时才判断是否连续 - 内层while判断同样增加边界校验,保证
i+j+1不会超过数组最大索引 - 可选优化:用
StringBuilder代替String拼接,避免频繁生成字符串对象,性能更好
修正后的完整代码如下:
class Solution { public static String rangeExtraction(int[] arr) { StringBuilder res = new StringBuilder(); int end = 0; int j = 0; for (int i = 0; i < arr.length; i++) { System.out.println("i=" + i); // 增加边界校验,避免i是最后一个元素时访问i+1越界 if (i + 1 < arr.length && arr[i] + 1 == arr[i + 1]) { // 增加边界校验,避免访问超出数组长度的索引 while (i + j + 1 < arr.length && arr[i + j] + 1 == arr[i + j + 1]) { end = arr[i + j + 1]; j++; System.out.println("j=" + j); } if (j != 1) { res.append(arr[i]).append("-").append(end).append(","); } else { res.append(arr[i]).append(",").append(end).append(","); } i += j; j = 0; } else { res.append(arr[i]).append(","); } } return res.substring(0, res.length() - 1); } }
用你给出的测试数组运行修正后的代码,输出结果和预期的"-6,-3-1,3-5,7-11,14,15,17-20"完全一致。
内容的提问来源于stack exchange,提问作者Pogus
相关产品推荐
相关产品推荐

