在Java中,break语句如何与嵌套循环交互?

42
我知道 break 语句可以跳出循环,但它是跳出嵌套循环还是只跳出当前的循环呢?
4个回答

85

不加修饰,break将会跳出最内层循环。因此,在这段代码中:

while (true) { // A
    while (true) { // B
         break;
    }
}

break 只能退出循环 B,所以代码将会无限循环下去。

然而,Java 有一个叫做“命名的 break”功能,你可以为你的循环取一个名字,并指定要退出哪个循环。例如:

A: while (true) {
    B: while (true) {
         break A;
    }
}

这段代码不会永远循环下去,因为 break 明确离开了循环 A

幸运的是,同样的逻辑对于 continue 也适用。默认情况下,continue 执行包含 continue 语句的最内层循环的下一个迭代,但也可以通过指定要继续执行的循环的标签来跳转到外部循环迭代。

在其他语言中(例如 C 和 C++),这种 “带标签的 break” 语句不存在,而且很难跳出多重嵌套的循环。虽然可以使用 goto 语句来实现,但通常被视为不良实践。例如,在 C 中,如果愿意忽略 Dijkstra 的建议并使用 goto,嵌套的 break 可能看起来像这样:

while (true) {
    while (true) {
        goto done;
    }
}
done:
   // Rest of the code here.

希望这能帮到你!


15
好的回答。然而,如果你发现自己要使用命名断点,很可能你没有用“正确的方式”来完成它。 :-) - Haakon
2
为了看你的代码的人着想,请不要使用具名的break! - Tazzy531
6
命名断点并不那么糟糕,有些情况下它们是最好的选择。然而,一年使用超过两次就有些奇怪了。 - maaartinus
4
有时候使用命名的中断并没有什么问题,特别是当替代方案是多个控制变量和复杂的条件逻辑时。 - DJClayworth

4
默认情况下,它会跳出最内层循环。但你可以指定标签并使其跳出外部循环。 点击此处了解更多信息。

0

你也可以使用异常来中断程序,这样你就可以处理多种情况。

 void fkt1() {
    try {
        while (true)
            fkt2();
    } catch (YourAbortException e) {
        e.printStackTrace();
    }

    //go on
}

void fkt2() {
    while (true)
        if (abort)
            throw new YourAbortException();
}

1
是的,但请注意不要使用异常来实现逻辑。 - Vetras

-2

它会打破一个循环。非常简单。例如:

for loop
   for loop
      break;
   end for loop
end for loop

跳出内部循环但仍在外部循环中


答案与Java语言无关 - acabra85

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接