Java: For Loop 异常迭代导致越界错误

Java: For Loop iterating strangely causing out of bounds errors

我有一个循环遍历一串数字的 for 循环。我还有一个数组,它的长度与由表示该索引最大值的数字组成的字符串相同。代码遍历字符串和数组的每个索引,并检查字符串中 i 处的数字是否小于或等于数组中 i 索引处的最大值。

在本例中,字符串长度为 11,因此数组长度也为 11。因此,字符串和数组的索引从 0 开始到 10。问题是有时 for 循环会随机地一直上升到 11 并使程序崩溃并给出越界错误。我说随机是因为它可以是第一组迭代或直到第四组迭代。我看了一下调试器 (Intelli-J IDEA),它在步进时上升了。我不明白为什么会这样。

代码:



for(int i = 0; i < stringOfNumbers.length(); i++){

    System.out.println(i); // Print for debug purpose
    
    if(Integer.parseInt(String.valueOf(stringOfNumbers.charAt(i))) <= arrayOfMaxValues[i]){

        // do something
        // successful run
    }
    else{
        
        // do something
        // unsuccessful run
    }
}

这是控制台给我的:

0
1
2
3
4
5
6
7
8
9
10
Iteration 1 done
0
1
2
3
4
5
6
7
8
9
10
11
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 11 out of bounds for length 11
    at Main.checkValidity(Main.java:91)
    at Main.main(Main.java:63)

Java 解析 'left to right'。至关重要的是,错误发生在 arrayOfMaxValues[i],而不是 stringOfNumbers.charAt(i)。如果 stringOfNumbers 真的有 11 的长度,它会在那里崩溃,带有 IndexOutOfBoundsException(而不是 ArrayIndexOutOfBoundsException)。

结论:您的字符串至少有 12 个字符长。

您粘贴的代码并未说明这是如何发生的,但确实发生了。您的 for 循环从 0 循环到字符串的长度。因此,如果字符串的长度为 Y,而您的数组的长度为 X,其中 Y 大于 X,这种情况总会发生。在写入字符串的位置搜索代码。

如果您写入 // do something 部分内的字符串,您将得到解释。 Java 实际上并没有开始 for 循环: 对,我们从 0 循环到 10,因为 现在 stringOfNumbers.length() 是 11.

事情不是这样的。 Java 通过执行 for 循环 (int i = 0) 的初始值设定项来启动循环,然后将立即检查条件(0 是否小于 stringOfNumbers 变量的长度当前指向?它是;现在 stringOfNumbers.length() 是 11)。然后它循环,一旦循环完成,它执行增量部分(i++),然后简单地重新运行表达式i < stringOfNumbers.length(),如果表达式为假,将跳出循环。

因此,如果您在循环内更新 stringOfNumbers,循环将稍后结束。

如果您不想要,请不要写信给 stringOfNumbers;写入其他内容并在循环后覆盖 stringOfNumbers 。或者,您可以这样做:

for (int i = 0, len = stringOfNumbers.length(); i < len; i++) { ... }

这个 'caches' for 循环开始时的长度,并且只检查 i 这个缓存的长度,而不是 stringOfNumbers 当前 的长度指着.