打破标签没有控制标签

时间:2016-04-01 14:47:01

标签: java

我是Java新手并为OCA做准备。我正在尝试休息并继续使用标签。通过指南中的描述,似乎在带标签时,只需将控件带到标签上即可。但是使用测试代码时,如果break的标签是早期行,也没有从标签开始执行,那么它就不会抛出错误。

虽然我永远不会使用break并继续使用label。但从考试的角度来理解它很重要。

示例代码:

public class B{
    public static void main(String[] args){
        int i = 0;

        label1: for(;i<=10;i++){
            System.out.println(i);
            if(i==4)
                continue label1;
        }
        System.out.println("out" + i);

        i=0;
        label2: for(;i<=10;i++){
            System.out.println(i);
            if(i==4)
                break label2;
        }
        System.out.println("out" + i);
    }

}

结果:

java B
0
1
2
3
4
5
6
7
8
9
10
out11
0
1
2
3
4
out4

为什么break不是从标签继续执行?

还包括指南摘录:

excerpt

我对亚西尔答案中的例子的理解:

标签应该有一个块可以跟随。

继续在块的开始处带来控制并且在结束时断开。感谢

3 个答案:

答案 0 :(得分:5)

两种陈述之间存在差异。

Break (JLS §14.15)

  

break语句转移封闭语句的控制 out

Continue (JLS §14.16)

  

[...]控制传递到迭代的 循环连续点   言。

实施例

以下是两个非常简单的例子,在现实生活中根本没用,只是为了演示使用不同语句的动作。

// This will print "continue" forever.
CONTINUE_LOOP:
while(true) {
    System.out.println("continue");
    continue CONTINUE_LOOP;
}

// This will only print "break" once and then break out of the loop
BREAK_LOOP:
while(true) {
    System.out.println("break");
    break BREAK_LOOP;
}

答案 1 :(得分:1)

Break需要简单或嵌套循环。你的例子是单循环所以不能感觉到效果。您的示例可以修改为演示中断的功能如下(不使用任何for,while循环,需要,以避免代码无法访问错误):

public class B{
    public static void main(String[] args){
        int i = 0;
        label1:
        {
            label2:
            {
                i++;
                if(i>0)
                    break label1;
                i++;
            }
            i++;

        }
        System.out.println("out" + i);
    }

}

代码将打印出1,但如果您将条件更改为i == 0或i <1,那么您将得到3作为答案。如果你改变break语句来打破label2那么你将获得2作为答案。

  

如果继续,您需要将标签作为循环标签。

希望它可以帮助你通过OCA考试。

答案 2 :(得分:0)

带标签的中断将导致程序在标签后继续执行,而带标签的继续将导致程序继续执行标签。这是因为休息是为了突破&#34;循环或标签的继续是为了#34;继续&#34;在循环或标签中执行但在下一个循环迭代中执行。

以下https://github.com/techtalk/SpecFlow/issues/502使用3个循环,全部嵌套在一起。由于无法从最内层循环内部彻底突破最外层循环,因此我们可以使用标签break来完成此操作,并在outer1: for(int i=0; i<5; i++) { for(int j=0; j<4; j++) { for(int k=0; k<2; k++) { System.out.println("[" + i + "][" + j + "][" + k + "]"); if(j == 3) { break outer1; } } } } 语句旁边指定标签。

[0][0][0]
[0][0][1]
[0][1][0]
[0][1][1]
[0][2][0]
[0][2][1]
[0][3][0]

输出:

j == 3

注意显示的最后一行是“[0] [3] [0]”,这是break outer1;的位置,我们称之为continue outer1;以突破最外层循环。

您还可以使用break with label example继续从特定点进行循环。采用最后一个示例并只更改一行以指定break outer1;而不是outer1将导致循环从continue outer1标签继续循环而不是中断循环。注意每次调用outer1: for(int i=0; i<5; i++) { for(int j=0; j<4; j++) { for(int k=0; k<2; k++) { System.out.println("[" + i + "][" + j + "][" + k + "]"); if(j == 3) { continue outer1; } } } 时,代码在将循环索引i递增1之后继续从外部循环开始。

[0][0][0]
[0][0][1]
[0][1][0]
[0][1][1]
[0][2][0]
[0][2][1]
[0][3][0] <---- CONTINUE WITH LABEL CALLED HERE
[1][0][0] <---- CONTINUES FROM NEXT ITERATION OF OUTER LOOP
[1][0][1]
[1][1][0]
[1][1][1]
[1][2][0]
[1][2][1]
[1][3][0] <---- CONTINUE WITH LABEL CALLED HERE
[2][0][0] <---- CONTINUES FROM NEXT ITERATION OF OUTER LOOP
[2][0][1]
[2][1][0]
[2][1][1]
[2][2][0]
[2][2][1]
[2][3][0] <---- CONTINUE WITH LABEL CALLED HERE
[3][0][0] <---- CONTINUES FROM NEXT ITERATION OF OUTER LOOP
[3][0][1]
[3][1][0]
[3][1][1]
[3][2][0]
[3][2][1]
[3][3][0] <---- CONTINUE WITH LABEL CALLED HERE
[4][0][0] <---- CONTINUES FROM NEXT ITERATION OF OUTER LOOP
[4][0][1]
[4][1][0]
[4][1][1]
[4][2][0]
[4][2][1]
[4][3][0]

输出:

NgClass

来源: labels with the continue statement