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
当前 的长度指着.
我有一个循环遍历一串数字的 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
当前 的长度指着.