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次后不会停止,而另一个循环则停止。有人可以解释这两者之间的区别吗?我以为贴上标签的标签会在贴标签后立即折断身体...
在第一个示例中,您的语法不正确(针对您想要的行为)。这个
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
。
我以为标记的中断会在标记之后使身体折断。
没有它破坏标签所附加的语句(或块)。
因此:
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
,do
或for
语句;此语句,称为中断目标“带有标签
,然后立即正常完成。在这种情况下,中断目标不必是break
的Identifier
语句尝试将控制权转移到与其标签具有相同Identifier
的封闭标签语句(第14.7节);此语句称为break targetswitch
,while
,do
或for
语句。“因此,确定
break
语句(常规或标记的)的作用的关键是中断目标
这有点晦涩难懂,这是仅在绝对必要时才使用带标签的语句的另一个很好的理由。我无法在您的示例中看到使用它们的理由(除非作为说明)。其中一个应为
编写为普通break
,另一个应为编写为continue
。但是(对于怀疑者来说,这两个示例都是有效的,可编译的Java代码,并且根据JLS都有明确定义的含义。
在您的情况下,您不需要标记休息时间。在Java中,break语句中断包含它的循环。因此,您的stop2
代码块确实可以是。
for(int x = 0; x < 5; x++)
stop2: {
System.out.println("Count");
if (x == 2)
break stop2;
}