繁体   English   中英

即使标签位于封闭循环中,也缺少“中断标签”

[英]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不能解析为变量,这仅仅是第一个错误的结果。

您不能在局部变量声明之前使用标签。 有关更多详细信息,请参见此答案

从JSL 14.15开始。 中断声明

标签为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM