You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]同样会访问非法索引,只是你的测试用例中提前在内层循环触发了异常,所以没暴露这个问题。
修正方案

需要做两处核心改动,另有一处可选性能优化:

  1. 外层if判断增加边界校验,只有i+1 < arr.length时才判断是否连续
  2. 内层while判断同样增加边界校验,保证i+j+1不会超过数组最大索引
  3. 可选优化:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 19:06:03