2
for(int x = 0; x < 5; x++)
        stop2: {
                System.out.println("Count");
                if (x == 2)
                    break stop2;
        }

        stop3: for(int x = 0; x < 5; x++) {
                System.out.println("Second");
                if (x == 2)
                    break stop3;
        } 

当我在 Java 中学习带标签的 break 时,我注意到将标签放在 for 语句之前和之后会产生不同的结果。在上面的代码中,带有stop2的 for 循环在打印“Count” 3 次后并没有停止,而另一个则停止了。有人可以解释这两者之间的区别吗?我认为标记的休息会在标签之后立即打破身体......

4

4 回答 4

4

在第一个示例中,您的语法不正确(对于您想要的行为)。这个

for(int x = 0; x < 5; x++)
stop2: {
    System.out.println("Count");
    if (x == 2)
        break stop2;
}

应该

stop2: for (int x = 0; x < 5; x++) {
    System.out.println("Count");
    if (x == 2) {
        break stop2;
    }
}

或者只是

for (int x = 0; x < 5; x++) {
    System.out.println("Count");
    if (x == 2) {
        break;
    }
}

因为break当没有标签应用于break.

于 2020-01-25T04:14:31.180 回答
3

我认为标记的中断会在标签之后立即破坏身体。

不,它破坏了标签所附的语句(或块)。

因此:

  for (int x = 0; x < 5; x++)
      stop2: {
            // stuff
            break stop2;
      }

打破for循环的主体语句,但是

 stop3: for (int x = 0; x < 5; x++)
      {
          //stuff
          break stop3;
      }

打破for声明。

对比上面这个

for (int x = 0; x < 5; x++)
      {
          //stuff
          break;
      }

普通(未标记)break只能在循环或 switch 语句中使用,它会破坏立即封闭的循环或 switch。

这就是JLS 14.15所说的:

break没有标签的语句试图将控制转移到最里面的封闭方法或初始值设定项的switch, while,dofor语句;此语句称为中断目标,然后立即正常完成。”

break带有标签的语句Identifier试图将控制转移到Identifier与其标签相同的封闭标签语句(第 14.7 节);该语句称为中断目标,然后立即正常完成。在这种情况下,中断目标不需要是一个switch, while, do, 或for语句。”

因此,确定break语句(普通或标记)做什么的关键是中断目标是什么。


这有点晦涩难懂……还有一个很好的理由,即仅在绝对必要时才使用带标签的语句。我看不到在您的示例中使用它们的理由(插图除外)。其中一个应该写成普通break的,另一个应该写成continue

但是(对于怀疑者)这两个示例都是有效的、可编译的 Java 代码,并且根据 JLS 都具有明确定义的含义。

于 2020-01-25T06:13:55.117 回答
1

在您的情况下,您不需要标记休息时间。在 Java 中,break 语句会中断包含它的循环。所以你的stop2代码块真的可以。

for (int x = 0; x < 5; x++) {
    System.out.println("Count");
    if (x == 2) {
        break stop2;
    }
}

标记中断的一个例子就是这样。

考虑您在循环中有一个循环,并且在某些情况下您想跳出外循环。例子:

stop2:
for (int x=0; x < 5; x++) {
  for (int y=0; y<5;y++) {
    if (x == 3 && y == 2)  { //just making up some condition for the example
        break stop2;
    }
  }
}
于 2020-01-25T04:19:53.730 回答
1
      for(int x = 0; x < 5; x++)
        stop2: {
                System.out.println("Count");
                if (x == 2)
                    break stop2;
        }

在这种情况下,当您中断标签 stop2 时,控件会再次返回到 for 循环并从下一次迭代 (x = 3) 开始。

        stop3: for(int x = 0; x < 5; x++) {
                System.out.println("Second");
                if (x == 2)
                    break stop3;
        } 

在情况 2 中,当您打破标签 stop3 时,控件不会再次返回到 for 循环。

于 2020-01-25T04:37:46.133 回答