标记为循环刚结束时中断在Java中不起作用 for(int x=0;x

标记为循环刚结束时中断在Java中不起作用 for(int x=0;x,java,for-loop,break,labeled-statements,Java,For Loop,Break,Labeled Statements,当我学习Java中带标签的break时,我注意到将标签放在for语句之前和之后会产生不同的结果。在上面的代码中,带有stop2的for循环在打印“Count”3次后不会停止,而另一个循环会停止。有人能解释一下这两者的区别吗?我认为标签上的break会在标签后面打断主体…在第一个示例中,您的语法不正确(针对您想要的行为)。这个 for(int x = 0; x < 5; x++) stop2: { System.out.println("Cou

当我学习Java中带标签的break时,我注意到将标签放在for语句之前和之后会产生不同的结果。在上面的代码中,带有stop2的for循环在打印“Count”3次后不会停止,而另一个循环会停止。有人能解释一下这两者的区别吗?我认为标签上的break会在标签后面打断主体…

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

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;
        } 
for(int x=0;x<5;x++)
第二站:{
系统输出打印项次(“计数”);
如果(x==2)
中断停止2;
}
应该是

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++){
系统输出打印项次(“计数”);
如果(x==2){
中断停止2;
}
}
只是

stop2: for (int x = 0; x < 5; x++) {
    System.out.println("Count");
    if (x == 2) {
        break stop2;
    }
}
for(int x=0;x<5;x++){
系统输出打印项次(“计数”);
如果(x==2){
打破
}
}

由于未对
中断应用标签时,未标记的
中断将应用于第一个(即最里面的)循环,因此在您的情况下,不需要标记的中断。
在Java中,break语句中断包含它的循环。
因此,您的
stop2
代码块实际上可以是

for (int x = 0; x < 5; x++) {
    System.out.println("Count");
    if (x == 2) {
        break;
    }
}
for(int x=0;x<5;x++){
系统输出打印项次(“计数”);
如果(x==2){
中断停止2;
}
}
有标签的中断示例如下

假设您在一个循环中有一个循环,并且在某些情况下,您希望从外部循环中断。 例如:

stop2:
对于(int x=0;x<5;x++){
for(int y=0;y
for(int x=0;x<5;x++)
第二站:{
系统输出打印项次(“计数”);
如果(x==2)
中断停止2;
}
在这种情况下,当您中断标签stop2时,控件将再次返回for循环,并开始下一次迭代(x=3)

stop3:for(int x=0;x<5;x++){
System.out.println(“第二”);
如果(x==2)
中断停止3;
} 
在案例2中,当您断开标签stop3时,控件不会再次返回for循环

我以为贴有标签的破口会在贴有标签后把身体弄坏

否。它会断开标签所附着的语句(或块)

因此:

断开
语句的

将上述内容与此进行对比

 stop3: for (int x = 0; x < 5; x++)
      {
          //stuff
          break stop3;
      }
for(int x=0;x<5;x++)
{
//东西
打破
}
普通的(未标记的)
break
只能在循环或switch语句中使用,它会中断立即封闭的循环或开关

这是关于这个的说法:

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

“带有标签
标识符
break
语句试图将控制权转移到包含标签的语句中(§14.7)具有与其标签相同的
标识符
;此语句称为中断目标,然后立即正常完成。在这种情况下,中断目标不需要是
开关
while
do
for
语句

因此,确定
break
语句(普通或带标签)的功能的关键是break目标是什么


这一切都有点模糊……这也是只有在绝对必要时才使用带标签语句的另一个很好的理由。我看不出在您的示例中使用它们的理由(作为插图除外)。其中一个应该作为普通的
break
编写,另一个应该作为
continue
编写


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

第一个示例是不合法的。我很惊讶它能编译。@user207421-试试看……并检查我答案中的JLS链接。@user207421如何删除?a
break
没有标签,我ans循环也不需要标签。您的意思是,如果循环有标签,则在查找最内层时不会考虑它。我相信您不是这个意思。谢谢,该示例只是一个说明。
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;
    }
  }
}
      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;
        } 
  for (int x = 0; x < 5; x++)
      stop2: {
            // stuff
            break stop2;
      }
 stop3: for (int x = 0; x < 5; x++)
      {
          //stuff
          break stop3;
      }
for (int x = 0; x < 5; x++)
      {
          //stuff
          break;
      }