仅在循环之后在Java中无法使用标签的中断

问题描述 投票:1回答:4
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中的标记中断,但我注意到将标记放在for语句之前和之后会有不同的结果。在上面的代码中,使用stop2的for循环在打印“ Count” 3次后不会停止,而另一个循环则停止。有人可以解释这两者之间的区别吗?我以为贴上标签的标签会在贴标签后立即折断身体...

java for-loop break labeled-statements
4个回答
3
投票

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

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


1
投票

我以为标记的中断会在标记之后使身体折断。

没有它破坏标签所附加的语句(或块)。

因此:

  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语句尝试将控制权转移到立即封闭的方法或初始化程序的最内层的switchwhiledofor语句;此语句,称为中断目标

,然后立即正常完成。”

“带有标签breakIdentifier语句尝试将控制权转移到与其标签具有相同Identifier的封闭标签语句(第14.7节);此语句称为break target

,然后立即正常完成。在这种情况下,中断目标不必是switchwhiledofor语句。“

因此,确定break语句(常规或标记的)的作用的关键是中断目标

的作用。

这有点晦涩难懂,这是仅在绝对必要时才使用带标签的语句的另一个很好的理由。我无法在您的示例中看到使用它们的理由(除非作为说明)。其中一个应为

编写为普通break,另一个应为编写为continue

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


0
投票

在您的情况下,您不需要标记休息时间。在Java中,break语句中断包含它的循环。因此,您的stop2代码块确实可以是。


0
投票
      for(int x = 0; x < 5; x++)
        stop2: {
                System.out.println("Count");
                if (x == 2)
                    break stop2;
        }
© www.soinside.com 2019 - 2024. All rights reserved.