【问题标题】:What is the best way to exit loop in Java? [closed]在 Java 中退出循环的最佳方法是什么? [关闭]
【发布时间】:2015-04-06 18:44:55
【问题描述】:

在 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++;
}

【问题讨论】:

标签: java loops while-loop break


【解决方案1】:

有些人可能会发现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

在 Java 中完成循环的最佳方法是什么?

如果两者之间真的有最好的方法,Java 可能不会允许另一个;)

我想最重要的是使用与co-worker 相同的约定,因此代码不会因类而异。

【讨论】:

  • 我发现break 更直接,并且标记更难调试,特别是如果您有多个标记。当然,它是基于主要意见的。
  • 实际上,我因在 for 循环中使用标志而受到了很多痛苦。但是你说你应该not 使用语言规范中的东西似乎有点荒谬
  • “想象一个包含超过 500 行代码的 loop 正文” - 请不要编写这样的代码。
  • 想象一下跟踪那个“简单”的布尔标志,而不是快速休息!
  • @Jean-FrançoisSavard 这不是break 的问题,而是代码的一般问题。
【解决方案2】:

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

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

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

我的意见是,如果您不了解breakcontinue 的用法,那么您可能会一直使用flag。但答案不止一个。您的问题是退出循环哪个选项更好,从您的两个示例中该选项很简单。我的意见是break 一个。

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

我可以给你很多例子,其中一些我会选择flag,而另一些我会选择break,还有一些两者兼而有之。这取决于我的循环要处理什么。

break 是为了标记如果我们达到这个条件,我们将完全退出循环。这在某些循环逻辑中非常重要。 即使您/同事在该条件之前或之后添加更多逻辑,循环仍然会在到达break 的位置退出。

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

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

请记住,您也可以将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");
    }
}

【讨论】:

    【解决方案3】:

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

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

    或者更好,因为exitboolean,直接评估它:

    while (a < 5 && !exit) {
    

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

    一旦您将项目指南考虑因素抛在脑后,这完全是一个偏好问题。就个人而言,我更喜欢break 语句,特别是如果我有几个条件需要评估。例如:

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

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

    【讨论】:

      【解决方案4】:

      我取决于您所说的“最佳”是什么意思?使用中断,您可以提前退出循环,这样效率更高。

      【讨论】:

      • 你也可以带着标志提前退出...
      【解决方案5】:

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

      另外,当使用条件时,给它一个名字。 ageBelow18today.getYear() &lt; customer.getBirthday().getYear(); 更容易理解(代码不正确,我知道)。

      【讨论】:

      • 关于{} 建议,我认为这并不总是必要的。这完全取决于它是否使代码更具可读性。
      • 没错。没必要,但是后来有多少人出了问题,就省略了。
      • 我也认为在条件上执行简单的一行语句时确实不需要{}
      • 在没有elseif 或没有大括号分隔的else 中缩进第二条语句是一个难以发现的错误。来自文档:决定何时省略大括号是个人喜好问题。省略它们会使代码更脆弱。如果稍后将第二条语句添加到“then”子句中,一个常见的错误是忘记添加新需要的大括号。编译器无法捕捉到这种错误;你只会得到错误的结果。
      【解决方案6】:

      您提出的这两个选项都不如两个选项。

      在简单比较后直接退出循环,那么最好的选择是:

      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) 表明退出循环的唯一方法是使用中断,因此程序员应该留意它们。中断也应该在循环体的顶部组合在一起,因此它们充当保护措施,防止循环体在其条件被满足时被执行。

      【讨论】:

        【解决方案7】:

        我会选择 break 语句,因为:

        • 代码更干净
        • 无需额外的代码声明
        • 调试代码更容易
        • 在条件上声明的大量标志是很常见的。您不会希望在同一行中获得大量嵌套条件。

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

        【讨论】:

          猜你喜欢
          • 2013-04-21
          • 2017-04-21
          • 2011-01-22
          • 2021-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多