[英]Break Label is missing even when the label is inside the enclosing loop
谁能告诉我为什么编译器说以下代码中缺少标签:
情况1:
错误:缺少标签
void crazyLoop() {
int c = 0;
JACK: while (c < 8) {
JILL: System.out.println(c);
if (c > 3)
break JILL;
else
c++;
}
}
在这里JILL
是可以到达的,因为我在JACK
而不是JACK
之外声明了JILL
。
CASE2:
错误: c无法解决。 如果我这样做:
void crazyLoop() {
JILL:int c = 0;
JACK: while (c < 8) {
System.out.println(c);
if (c > 3)
break JILL;
else
c++;
}
}
编译器说c
无法解析为变量。
有人可以解释发生了什么吗?
问题出在JILL:int c = 0;
,因为根据Java语法,它无效。 因此,错误c不能解析为变量,这仅仅是第一个错误的结果。
您不能在局部变量声明之前使用标签。 有关更多详细信息,请参见此答案 。
标签为Identifier的break语句尝试将控制权转移到与标签具有相同Identifier的封闭标签的语句(第14.7节)
因此,错误是由break语句未引用循环的标签引起的。 同样,仅语句可以具有标签前缀。 请参阅文件
以下代码成功编译:
void crazyLoop() {
int c = 0;
ILL:
c= 0;
JACK: while (c < 8) {
System.out.println(c);
if (c > 3)
break JACK;
else
c++;
}
请参阅Java参考 :
带标签的语句的标签范围是紧随其后的Statement 。
这意味着最好将标签放置在诸如for循环之类的复合语句之前。
JACK: while (c < 8) {
JILL: System.out.println(c);
if (c > 3)
break JILL;
else
c++;
}
JILL的范围只是System.out.println(c);
;。 。 break JACK
将打破while循环。 声明之后,JILL是未知的。
未知c
的第二个错误似乎是编译器将标记的语句封装在{ }
。 可能这是一个编译器“错误”(复合语句假设)-但是其他读者可能会发现一些启示:尝试其他编译器,在声明的引用中找到内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.