我第一次看到这个关键字,我想知道是否有人可以向我解释它是做什么的。

continue关键字是什么? 它是如何工作的? 什么时候使用?


当前回答

如前所述,continue将跳过处理它下面的代码,直到循环结束。然后,您将移动到循环的条件,如果这个条件仍然成立,则运行下一次迭代(或者如果存在标志,则运行到所示循环的条件)。

必须强调的是,在do - while的情况下,您将被移动到continue之后的底部条件,而不是在循环的开始。

这就是为什么很多人不能正确回答下面的代码将生成什么。

    Random r = new Random();
    Set<Integer> aSet= new HashSet<Integer>();
    int anInt;
    do {
        anInt = r.nextInt(10);
        if (anInt % 2 == 0)
            continue;
        System.out.println(anInt);
    } while (aSet.add(anInt));
    System.out.println(aSet);

*如果你的答案是aSet只包含100%的奇数…你错了!

其他回答

不带标签的continue语句将从最里面的while或do循环的条件和最里面的for循环的更新表达式重新执行。它通常用于提前终止循环的处理,从而避免深度嵌套的if语句。在下面的例子中,continue将获取下一行,而不处理循环中的下面语句。

while (getNext(line)) {
  if (line.isEmpty() || line.isComment())
    continue;
  // More code here
}

使用标签,continue将从带有相应标签的循环中重新执行,而不是从最内层的循环中执行。这可以用来转义嵌套很深的循环,或者只是为了清晰。

有时,continue也被用作占位符,以使空循环体更清晰。

for (count = 0; foo.moreData(); count++)
  continue;

在C和c++中也存在相同的没有标签的语句。接下来是Perl中的等效程序。

这种类型的控制流是不推荐的,但是如果你这样选择,你也可以使用继续来模拟有限形式的goto。在下面的例子中,continue将重新执行空的for(;;)循环。

aLoopName: for (;;) {
  // ...
  while (someCondition)
  // ...
    if (otherCondition)
      continue aLoopName;

如果你把循环体看作子程序,continue就有点像return。同样的关键字在C中也存在,而且用途相同。这里有一个人为的例子:

for(int i=0; i < 10; ++i) {
  if (i % 2 == 0) {
    continue;
  }
  System.out.println(i);
}

这将只打印奇数。

考虑一个If Else条件。continue语句执行条件中的内容,并跳出条件,即跳转到下一个迭代或条件。但是Break会离开循环。 考虑下面的程序。

public class ContinueBreak {
    public static void main(String[] args) {
        String[] table={"aa","bb","cc","dd"};
        for(String ss:table){
            if("bb".equals(ss)){
                continue;
            }
            System.out.println(ss);
            if("cc".equals(ss)){
                break;
            }
        }
        System.out.println("Out of the loop.");
    }

}

它将输出:aa cc Out of the loop。

如果你用break代替了continue(在If .之后),它只会打印aa并退出循环。

如果满足条件"bb" = ss: 对于继续:它进入下一个迭代,即。“cc”.equals (ss)。 Break:它从循环中出来并打印“out of the loop”。

通常,我将continue(和break)视为代码可能使用某些重构的警告,特别是在while或for循环声明没有立即出现的情况下。方法中间的return也是如此,但原因略有不同。

正如其他人已经说过的那样,continue会移动到循环的下一个迭代,而break则会移出封闭的循环。

这些可以是维护定时炸弹,因为除了上下文之外,在继续/中断和它继续/中断的循环之间没有直接的联系;添加一个内部循环或将循环的“内脏”移动到一个单独的方法中,就会出现continue/break失败的隐藏效果。

依我之见,最好将它们作为最后的手段,然后确保它们的使用在循环的开始或结束时紧密地组合在一起,以便下一个开发人员可以在一个屏幕上看到循环的“边界”。

continue, break和return(除了方法末尾的一个True return)都属于“隐藏goto”的一般类别。他们把循环和函数控制放在意想不到的地方,最终导致bug。

continue必须在循环内,否则会显示如下错误:

继续到循环之外