在 Java 中退出循环的最佳方法是什么?

What is the best way to exit loop in Java?

在 Java 中结束 loop 的最佳方式是什么?

这个:

boolean exit = false;

while((a < 5) && (exit = false)){
   if(a == 3)
       exit = true;
   else
       a++;
}

或者这样:

while((a < 5){
   if(a == 3)
       break;
   else
       a++;
}

有些人可能会发现 break 更难调试(就个人而言,我更喜欢使用 flag),但这主要是见仁见智。

想象一个包含 500 多行代码的 loop 主体,到处都有一些 break 语句,您可能更难想象退出 loop 的所有可能性].

我喜欢使用 flag 的另一个原因是您可以为结束点指定一个有意义的名称,而不是简单地 break.

请注意,您还可以在 for 循环示例中使用 flag :

boolean flag = false;
for(int i = 0; !flag && i < 10; i++) {
// some treatment
}

然而,有趣的是,在处理循环时,有一个 continue 关键字,它允许您不 exit 循环,而是直接 skip下一个 iteration.

What is the best way to finish a loop in Java?

如果两者之间确实存在最佳方式,Java 可能不会允许另一个 ;)

我想最重要的是使用与您的 co-worker 相同的约定,因此代码与 class 和 class 没有区别。

我看你说的"best"是什么意思?使用 break,您可以提前退出循环,这样效率更高。

我更喜欢第一个,因为 goto 被认为是有害的。 exit 就像 goto。但更重要的是:在编写 if 子句时请始终使用 {}

此外,在使用条件时,请为其命名。理解 ageBelow18 而不是 today.getYear() < customer.getBirthday().getYear(); 几乎更简单(代码不正确,我知道)。

break 存在是有原因的,对吧!

while(a < 5){
   if(a == 3)
       break;
   else
       a++;
}

非常简单的答案,休息一下,更少的标志,更少的调试,更容易维护。从 while 循环更改为 for 循环很简单,无需对逻辑进行任何修改。想想你需要添加更多条件的场景......

我的意见是,如果你不了解breakcontinue的用法,那么你可能会一直去拿flag。但答案不止一个。你的问题是什么选项更适合退出循环,从你的两个例子来看,选项很简单。我的意见是break

现在有些人会使用标志,有些人会使用中断,他们会提供更适合的代码示例。但这不是你的问题!

我可以给你很多例子,其中一些我会选择 flag,另一些我会选择 break,还有一些是两者的混合。这取决于我的循环将要处理的内容。

break就是标志如果达到这个条件就emiditely跳出循环。这在某些循环逻辑中非常重要。 即使 you/co-worker 在该条件之前或之后添加更多逻辑,循环仍会在到达 break.

处退出。

有时您可能想标记您已达到某个条件,但仍想执行循环涵盖的所有指令,这里有一个 bool 帮助您停止循环,但在它执行了所有逻辑之后。

如果您没有以正确的方式使用 flag/break,您的系统可能会表现得很奇怪,特别是在添加新逻辑时。

请记住,您还可以将 breakcontinue 与标签一起使用,这不是很常见,但值得了解。

class ContinueWithLabelDemo {
    public static void main(String[] args) {

        String searchMe = "Look for a substring in me";
        String substring = "sub";
        boolean foundIt = false;

        int max = searchMe.length() - 
                  substring.length();

    test:
        for (int i = 0; i <= max; i++) {
            int n = substring.length();
            int j = i;
            int k = 0;
            while (n-- != 0) {
                if (searchMe.charAt(j++) != substring.charAt(k++)) {
                    continue test;
                }
            }
            foundIt = true;
                break test;
        }
        System.out.println(foundIt ? "Found it" : "Didn't find it");
    }
}

第一个片段在语法上是错误的 - = 是赋值运算符。您正在寻找相等运算符 ==:

while ((a < 5) && (exit == false)) {

或者更好,因为 exit 是一个 boolean,直接计算它:

while (a < 5 && !exit) {

除此之外,您应该始终努力遵循您正在从事的项目的惯例。如果它的编码风格更喜欢 breaks - 就使用它们。如果它禁止他们,不要。

一旦您将项目指南考虑事项排除在 window 之外,这完全是一个偏好问题。就个人而言,我倾向于使用 break 语句,尤其是当我有多个条件需要评估时。例如:

while (a < 5) {
    // do stuff
    if (a == 3) {
        break;
    }
    // do more stuff
    if (b >= 19) {
         break;
    }
    // etc...
}

但最终,您应该根据具体情况进行评估。像我一样偏爱 breaks 并不意味着你应该盲目地 总是 使用它们。选择使代码看起来更好且更易于维护的任何内容。

您提供的这两个选项都不如两个备选方案好。

简单对比一下直接退出循环,最好的选择是:

while (a < 5 && a != 3) {
    a++;
}

这是因为在执行主体之前需要检查这两个条件,并且在退出循环时不需要做任何特殊的事情。

但是,如果您需要在满足特定条件时需要一些特殊逻辑,那么您应该使用 while true 循环和中断。

while (true) {
    if (a >= 5) {
        break; // nothing special, just exit
    } else if (a == 3) {
        a *= 2; // double a before exiting loop
        break;
    }
    a++;
}

while (true) 表明退出循环的唯一方法是使用 break,因此程序员应该留意它们。中断也应该在循环体的顶部组合在一起,因此它们充当守卫,防止在满足条件时执行循环体。

我会选择 break 语句,因为:

  • 代码更干净
  • 不需要额外的代码声明
  • 调试代码更容易
  • 混淆在条件下声明的许多标志是很常见的。您不会希望在同一行上获得很多嵌套条件。

还存在 continue 关键字,可让您在必要时跳过部分代码。