有人可以告诉我为什么编译器说下面代码中缺少标签:
CASE1:
错误:标签缺失
void crazyLoop() {
int c = 0;
JACK: while (c < 8) {
JILL: System.out.println(c);
if (c > 3)
break JILL;
else
c++;
}
}
此处JILL
可以访问,因为我在JILL
内声明JACK
而不是JACK
之外。
CASE2:
错误: c无法解析。 如果我这样做:
void crazyLoop() {
JILL:int c = 0;
JACK: while (c < 8) {
System.out.println(c);
if (c > 3)
break JILL;
else
c++;
}
}
编译器说c
无法解析为变量。
有人可以解释一下发生了什么吗?
答案 0 :(得分:1)
问题在于JILL:int c = 0;
,因为根据Java语法它是无效的。因此,错误 c无法解析为变量只是第一个错误的影响。
您不能在本地变量声明之前使用label。有关详细信息,请参阅this answer。
答案 1 :(得分:1)
from JSL 14.15. The break Statement
带有标签标识符的break语句尝试转移控件 到具有相同标签的封闭标签声明(第14.7节) 标识符作为标签
因此错误是由break语句引起的,而不是指循环的标签。 此外,只有语句可能有标签前缀。 see documentation
以下代码成功编译:
void crazyLoop() {
int c = 0;
ILL:
c= 0;
JACK: while (c < 8) {
System.out.println(c);
if (c > 3)
break JACK;
else
c++;
}
答案 2 :(得分:0)
请参阅java reference:
标签声明的标签范围是立即包含的声明。
这意味着标签最好放在像for-loop这样的复合语句之前。
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
的第二个错误好像编译器在{ }
中封装了带标签的语句。可能是这是一个编译器&#34; bug&#34; (复合语句假设) - 但也许其他读者可以解释一下:尝试其他编译器,在声明的参考资料中找到一些东西。