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

时间:2015-06-03 01:24:02

标签: java label java-8 standards

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

  

LabeledStatement:

     

标识符:声明

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

select * where {
?game a dbpedia-owl:Game ;
dbpprop:name ?name ; 
dbpedia-owl:publisher ?publisher . }

直观地说,这也编译:

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

}

但是以下编译:

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

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

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

所以问题取决于声明是否是陈述。根据标准(和online documentation):

  

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

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

1 个答案:

答案 0 :(得分:8)

表达式

int k = 3; 

local variable declaration statement

标签语句

语法中使用的statement
  

LabeledStatement

     

IdentifierStatement

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

本地变量声明语句可以在blocks中使用,可以在带标签的语句中使用。