"continue"关键字在Java中是什么,它如何工作?

314

我第一次看到这个关键字,想知道有人能否解释一下它的作用。

  • continue关键字是什么?
  • 它是如何工作的?
  • 在什么情况下会使用它?
12个回答

527

continue有点像goto。你熟悉break吗?通过对比来思考它们更容易理解:

  • break 终止循环(跳转到下面代码执行)。

  • continue 终止当前迭代中的循环代码的后续处理,但是继续该循环的下一次迭代。


424

没有标签的 continue 语句会从最内层的 whiledo 循环条件重新执行,并从最内层的 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中的等效语句为next

不建议使用这种类型的控制流,但如果你选择这么做,你也可以使用continue来模拟有限形式的goto。在以下示例中,continue将重新执行空的for (;;)循环。

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

我想要提醒一下,如果你必须使用"continue"关键字,那么你的循环在基本层面上已经出现了问题,你将会使用比实际需要更多的内存,并且你的循环逻辑也已经出错了。 - Slipoch

104

让我们看一个例子:

int sum = 0;
for(int i = 1; i <= 100 ; i++){
    if(i % 2 == 0)
         continue;
    sum += i;
}

这将获取从1到100的所有奇数之和。


28

如果您把循环体想象成一个子程序,continue 类似于 return。C 语言中也有相同的关键字,并且具有相同的作用。这里是一个假设的示例:

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

这将只打印出奇数。


16

一般来说,我认为continue(以及break)是警告代码可能需要重构的信号,特别是如果whilefor循环声明不在视野范围内。对于方法中的return,原因略有不同,但道理相同。

正如其他人已经说过的那样,continue会跳过当前迭代并继续下一个迭代,而break会退出包含它的循环。

这些语句可能造成维护时间炸弹,因为continue/break和它所在的循环之间没有直接联系,只有上下文关系;添加内部循环或将循环的"内脏"移到单独的方法中,就会导致continue/break失效的隐藏影响。

在我看来,最好将它们视为最后的手段,并确保它们的使用紧密地分组在循环的开头或结尾,这样下一个开发者就可以在一屏中看到循环的"边界"。

continuebreakreturn(除了方法的唯一真正返回值)都属于"隐藏的GOTO"的一般类别。它们将循环和函数控制放在意想不到的位置,最终导致错误。


我对“return语句为什么不好”的原因很感兴趣。我已经有一种感觉,即因为Scala不鼓励使用return语句 - Jus12
2
另一方面,允许一个方法从深度嵌套的循环中返回可能是最简单、最可读和最合理的做法,而不是创建额外的变量只是为了使循环退出看起来更干净。 - David R Tribble

5
在Java中,“continue”表示跳到当前循环的结尾,也就是说,如果编译器在循环中看到“continue”,它将进入下一次迭代。
例如:这是一个打印从1到10的奇数的代码。
每当编译器看到“continue”进入下一次迭代时,它将忽略打印代码。
for (int i = 0; i < 10; i++) { 
    if (i%2 == 0) continue;    
    System.out.println(i+"");
}


4
如前所述,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%的奇数...那么你错了!


4

Continue 是 Java 中的一个 关键字,用于跳过当前循环。

假设您想要打印从 1 到 100 的所有奇数。

public class Main {

    public static void main(String args[]) {

    //Program to print all odd numbers from 1 to 100

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

    }
}

在上面的程序中,continue语句仅在i为偶数时跳过迭代,并在i为奇数时打印其值。 Continue语句简单地使你退出循环而不执行循环内剩余的语句和触发下一次迭代。

3

考虑一个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 跳出循环.

如果你用break替换continue(在if之后),它只会打印aa和跳出循环。

如果条件"bb"等于ss得到满足: 对于Continue: 它跳到下一次迭代,即“cc”.equals(ss)。 对于Break: 它跳出循环并打印“跳出循环.”


2
很确定它还会打印“cc”,因为“cc”!=“bb”,而且打印语句在break之前。 - Ted Delezene

3

在循环控制结构中,如果需要立即跳转到下一个迭代,则使用continue语句。

它可与for循环或while循环一起使用。Java continue语句用于继续循环。它继续程序的当前流程并跳过指定条件下的剩余代码。

在内部循环中,它仅继续内部循环。

我们可以在各种类型的循环中使用Java continue语句,例如for循环、while循环和do-while循环。

例如:

class Example{
    public static void main(String args[]){
        System.out.println("Start");
        for(int i=0; i<10; i++){
            if(i==5){continue;}
            System.out.println("i : "+i);   
        }
        System.out.println("End.");
    }
}

输出:

Start
i : 0
i : 1
i : 2
i : 3
i : 4
i : 6
i : 7
i : 8
i : 9
End.

[number 5 is skip]


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