如果我们查看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中的这种行为。这是一个错误还是我误解了标准?
答案 0 :(得分:8)
表达式
int k = 3;
是local variable declaration statement。
标签语句
语法中使用的statement
LabeledStatement
:
Identifier
:Statement
不包含局部变量声明语句。因此,您无法直接在带标签的声明中使用它们。
本地变量声明语句可以在blocks中使用,可以在带标签的语句中使用。