标签是否是 Java 语句,如果标签是语句,它在 Java 语言规范中的何处定义为语句?
我的问题与 Jan Lahoda 在我发送给 Oracle 的错误报告中的以下回复有关。我无法在那里讨论它,因为我无法在 OpenJDK Jira 中获得一个帐户。
https://bugs.openjdk.java.net/browse/JDK-8211052
例如:
A: B: while (true) continue A;应用“continue”的语句不是“while (true) continue A;”,而是“B: while (true) continue A;”,规范要求continue的目标是while/do/for语句,这里没有实现。因此,编译时错误。
我认为 Java 中的标签不是语句,在 Jan 的示例中A,B标签和标签都与同一个 while 循环语句相关,因此不应触发编译时错误。
添加:
Java 中带标签的while/do/for 语句不是 while/do/for 语句吗?
遵循JLS aStatement可以
StatementWithoutTrailingSubstatement
LabeledStatement
IfThenStatement
IfThenElseStatement
WhileStatement
ForStatement
Run Code Online (Sandbox Code Playgroud)
与LabeledStatement存在
Identifier : Statement
Run Code Online (Sandbox Code Playgroud)
并指出
标识符被声明为立即包含的语句的标签
所以在循环的情况下
public void method() {
loop1: loop2: while (true) {
if (true) {
break loop1;
} else {
continue loop1;
}
}
}
Run Code Online (Sandbox Code Playgroud)
对Statement的Label loop1是整个loop2 ...的东西。
如果我们看一下break它的定义是这样说的
break 目标不必是 switch、while、do 或 for 语句。
而对于continue它来说
continue 目标必须是 while、do 或 for 语句,否则会发生编译时错误。
这些定义是正确的,符合编译器给出了一个编译器错误continue loop1说法,让break loop1是有效的,因为loop2: ...是不是一个“同时,这样做,或声明”。
关于您的实际问题:标签是否为 Java 语句?
以下代码完全合法并且编译良好
public void method() {
loop:;
}
Run Code Online (Sandbox Code Playgroud)
这遵循Statement-> LabeledStatement-> Identifier: Statement-> loop : Statement-> loop : StatementWithoutTrailingSubstatement-> loop : EmptyStatement->的扩展
loop : ;
Run Code Online (Sandbox Code Playgroud)
不,标签本身并不是一个声明,一个标识符(然后称为“标签”)加上一个冒号加上一个EmptyStatement( ;) 但是是。
Java 中的 while/do/for 语句不是标记为 while/do/for 语句吗?
不!
ALabeledStatement就是这样: a LabeledStatement。带标签的 whileStatement -> Label -> Identifier : Statement -> Identifier : WhileStatement与Statement -> WhileStatement!
| 归档时间: |
|
| 查看次数: |
183 次 |
| 最近记录: |