即使标签位于封闭循环内,也会丢失Break Label

时间:2016-11-10 13:26:28

标签: java labelled-break

有人可以告诉我为什么编译器说下面代码中缺少标签:

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无法解析为变量。

有人可以解释一下发生了什么吗?

3 个答案:

答案 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; (复合语句假设) - 但也许其他读者可以解释一下:尝试其他编译器,在声明的参考资料中找到一些东西。