为什么试图通过将计数器设置为条件来破坏循环的2会导致错误

  • 本文关键字:循环 错误 条件 计数器 设置 java
  • 更新时间 :
  • 英文 :


所以我注意到运行此代码会导致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;
    }
}

最新更新