在Java中使用break来退出循环是不好的做法吗?

Don*_*Don 73 java jvm loops break

我想知道使用break语句退出循环而不是满足循环条件是否是"不好的做法" ?

我对Java和JVM没有足够的了解来了解如何处理循环,所以我想知道我是否忽略了一些关键的东西.

这个问题的焦点:是否存在特定的性能开销?

chr*_*her 125

好主人没有.有时,在满足整体要求的循环中可能会发生某些事情,而不满足逻辑循环条件.在这种情况下,break用来阻止你在一个循环中无意义地骑自行车.

String item;

for(int x = 0; x < 10; x++)
{
    // Linear search.
    if(array[x].equals("Item I am looking for"))
    {
       //you've found the item. Let's stop.
       item = array[x];
       break; 
    }
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中更有意义的是什么.每次继续循环到10,即使你找到它,或循环直到找到项目并停止?或者把它变成现实世界的术语; 当你找到你的钥匙时,你会一直看吗?

编辑以回应评论

为什么不设置x11打破循环?这是毫无意义.我们有break!除非你的代码假设x肯定比10以后更大(并且它可能不应该),那么你就可以使用了break.

编辑为了完整

肯定还有其他模拟方法break.例如,在循环中为终止条件添加额外的逻辑.说这是无意义的循环或使用break是不公平的.正如所指出的,while循环通常可以实现类似的功能.例如,按照上面的例子..

while(x < 10 && item == null)
{
    if(array[x].equals("Item I am looking for"))
    {
        item = array[x];
    }

    x++;
}
Run Code Online (Sandbox Code Playgroud)

使用break简单意味着您可以通过for循环实现此功能.这也意味着,只要您希望循环的行为不同,您就不必在终止逻辑中添加条件.例如.

for(int x = 0; x < 10; x++)
{
   if(array[x].equals("Something that will make me want to cancel"))
   {
       break;
   }
   else if(array[x].equals("Something else that will make me want to cancel"))
   {
       break;
   }
   else if(array[x].equals("This is what I want"))
   {
       item = array[x];
   }
}
Run Code Online (Sandbox Code Playgroud)

而不是while loop具有如下所示的终止条件:

while(x < 10 && !array[x].equals("Something that will make me want to cancel") && 
                !array[x].equals("Something else that will make me want to cancel"))
Run Code Online (Sandbox Code Playgroud)

  • 什么是while循环而不是休息?然后所有循环完成条件都在循环的开始.`while(x <10 && item == null)`如果你感觉很好看,请使用迭代器. (5认同)

Mar*_*nik 18

在特定情况下使用break,就像几乎任何其他语言功能一样,可能是一种不好的做法,在这种情况下,您明显会误用它.但是如果没有它,一些非常重要的习语就无法编码,或者至少会导致代码的可读性低得多.在那些情况下,break是要走的路.

换句话说,不要听任何一揽子,不合格的建议 - break或其他任何事情.我已经看到代码完全憔悴只是为了字面上执行"良好实践".

关于您对性能开销的关注,绝对没有.在字节码级别,无论如何都没有显式循环结构:所有流控制都是根据条件跳转实现的.


ζ--*_*ζ-- 6

JLS指定中断是循环的异常终止.但是,仅仅因为它被认为是异常并不意味着它没有在许多不同的代码示例,项目,产品,航天飞机等中使用.JVM规范并未说明是否存在性能损失,尽管它是循环后,清除代码执行将继续.

但是,代码可读性可能会受到奇怪的中断.如果你在一个由副作用和奇怪的清理代码包围的复杂if语句中中断,可能与标签的多级中断(或者更糟糕的是,一个接一个地具有一组奇怪的退出条件),它不会对任何人都很容易阅读.

如果你想通过强制迭代变量超出迭代范围来破坏你的循环,或者通过引入一种不一定直接的退出方式来破坏你的循环,那么它的可读性就会低于break.

然而,以空的方式循环额外的时间几乎总是不好的做法,因为它需要额外的迭代并且可能不清楚.


Chr*_*erS 5

在我看来,For当完成固定数量的迭代时应该使用循环,并且在每次迭代完成之前它们不会被停止.在你想要先退出的另一种情况下,我更喜欢使用While循环.即使你读了这两个小词,它似乎也更合乎逻辑.一些例子:

for (int i=0;i<10;i++) {
    System.out.println(i);
}
Run Code Online (Sandbox Code Playgroud)

当我快速阅读这段代码时,我肯定会知道它会打印10行,然后继续.

for (int i=0;i<10;i++) {
    if (someCondition) break;
    System.out.println(i);
}
Run Code Online (Sandbox Code Playgroud)

这个对我来说已经不那么清楚了.为什么你首先声明你将进行10次迭代,但是然后在循环内添加一些额外的条件来提前停止?

我更喜欢上面用这种方式编写的例子(即使它更冗长,但只有1行更多):

int i=0;
while (i<10 && !someCondition) {
    System.out.println(i);
    i++;
}
Run Code Online (Sandbox Code Playgroud)

每个阅读此代码的人都会立即看到有一个额外的条件可能会提前终止循环.

当然,在非常小的循环中,你总是可以讨论每个程序员都会注意到break语句.但是我可以从我自己的经验中看出,在较大的循环中,这些休息可以被监督.(这带来了另一个话题,开始在较小的块中拆分代码)

  • 这没有考虑在for或while循环期间达到条件的情况.如果for/while循环触发了一个条件(或者某个东西正在另一个线程上执行),那么你可能不得不提前破解.您编写的while循环假定您只需要在迭代开始时检查条件. (2认同)