所以我注意到运行此代码会导致IndexOutOfBounds
错误。所以我有一个条件,如果条件为真,我需要break
,但通过设置计数器来破坏不起作用。为什么它不起作用?我应该做些什么来打破2个for
循环?
方法getRequirements()
只是简单地返回[7][24]的2D数组。
for (int i = 0; i < s.getRequirements().length; i++) {
for (int j = 0; j < s.getRequirements()[i].length; j++) {
if (j == 3) {
j = s.getRequirements()[i].length;
i = s.getRequirements().length;
}
}
}
j = s.getRequirements()[i].length;
i = s.getRequirements().length;
^它保证触发CCD_ 5,因为您在内部循环(og j
(中分配了CCD_。
为什么在第5行再次设置"i"?
如果您想中断父循环,只需将其标记为outer:
并使用break outer;
即可。如果你不这样做,"i"会随着需求的长度而更新,但"j"循环仍将处理,从而导致下一次使用i时出错。
导致错误的原因是循环按从最里面到最外面的顺序断开,因此条件j < s.getRequirements()[i].length
使用越界值i
进行检查,而不是由于未通过外部循环的边界检查而跳过。
通常,中断多个嵌套循环的最佳方法通常是标记中断。在你的代码中,它看起来像这样:
outerLoop:
for (int i = 0; i < s.getRequirements().length; i++) {
for (int j = 0; j < s.getRequirements()[i].length; j++) {
if (j == 3) {
break outerLoop;
}
}
}
只有当循环之后的代码关心循环索引变量时,才需要设置循环索引变量。
此异常的直接原因是内部循环条件依赖于i
,CCD_13被故意更改为超出最终元素。
j < s.getRequirements()[i].length
^ length of the i-th requirement
在赋值i = s.getRequirements().length
之后,代码尝试基于i
的新值来评估内部循环条件,然后得到异常。
正如@Douglas所建议的,你应该使用一个标记的break来打断两个以上的循环。
如果你真的想这样做,你可以使用一个局部变量来保持子数组的长度:
int n = s.getRequirements()[i].length;
for (int j = 0; j < n; j++) {
if (...) {
j = n;
i = s.getRequirements().length;
}
}