Java 为什么试图通过将计数器设置为条件来中断2 for循环会导致错误

Java 为什么试图通过将计数器设置为条件来中断2 for循环会导致错误,java,Java,所以我注意到运行此代码将导致IndexOutOfBounds错误。因此,我有一个条件,如果条件为真,我需要中断,但通过设置计数器中断不起作用。为什么它不起作用?我应该做些什么来打破2个for循环 方法getRequirements()只返回一个[7][24]的2D数组 for (int i = 0; i < s.getRequirements().length; i++) { for (int j = 0; j < s.getRequirements()[i]

所以我注意到运行此代码将导致
IndexOutOfBounds
错误。因此,我有一个条件,如果条件为真,我需要
中断
,但通过设置计数器中断不起作用。为什么它不起作用?我应该做些什么来打破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;
            }
        }
    }
for(int i=0;i
^它保证触发
IndexOutOfBounds
,因为您在内部循环(og
j
)中分配了
i
变量,该变量不会检查作为其终端条件的
i

为什么在第5行中再次设置“i”

如果要断开循环的父循环,只需将其标记为
outer:
并使用
breakouter
如果不这样做,“i”将根据需求的长度进行更新,但“j”循环仍将进行处理,从而在使用i的下一个get上导致错误。

这导致错误的原因是循环按从最内层到最外层的顺序断开,因此条件
j
使用越界值
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;
        }
    }
}
outerLoop:
对于(int i=0;i

仅当循环后的代码关心循环索引变量时,才需要设置循环索引变量。

此异常的直接原因是内部循环条件取决于
i
,它被故意更改为超出最终元素

j < s.getRequirements()[i].length
                        ^ length of the i-th requirement
j < s.getRequirements()[i].length
                        ^ length of the i-th requirement
int n = s.getRequirements()[i].length;
for (int j = 0; j < n; j++) {
    if (...) {
         j = n;
         i = s.getRequirements().length;
    }
}