Java标签不规则(可能的bug?)

Dav*_*nco 8 java standards label java-8

如果我们查看Java标准 §14.7,我们会看到语句可能有标签前缀,例如:

LabeledStatement:

     标识符:声明

理论上,标签应该能够标记任何后续声明.因此,例如,以下编译:

public class Test {
    public static void main(String[] args) {
    hello:
        return;
    }

}
Run Code Online (Sandbox Code Playgroud)

直觉上,这也编译:

public class Test {
    int i;
    public static void main(String[] args) {
        Test t = new Test();
    label:
        t.i = 2;        
    }
}
Run Code Online (Sandbox Code Playgroud)

但下列情况不能编译:

public class Test {
    public static void main(String[] args) {
    oops:
        int k = 3;  
    }
}
Run Code Online (Sandbox Code Playgroud)

即使这样做(注意范围括号):

public class Test {
    public static void main(String[] args) {
    oops:
        {
            int k = 3;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以问题取决于声明是否是陈述.根据标准(和在线文档):

除了表达式语句之外,还有另外两种语句:声明语句和控制流语句.声明语句声明一个变量.

我在OSX和Windows上都注意到Java 7和8中的这种行为.这是一个错误还是我误解了标准?

Sot*_*lis 8

表达方式

int k = 3; 
Run Code Online (Sandbox Code Playgroud)

是一个局部变量声明语句.

statement在标签语句的语法使用

LabeledStatement:

  Identifier : Statement

不包含局部变量声明语句.因此,您不能直接在带标签的声明中使用它们.

局部变量声明语句可以在中使用,可以在带标签的语句中使用.