标签是否是 Java 语句?

Ros*_*sny 4 java jls

标签是否是 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 的示例中AB标签和标签都与同一个 while 循环语句相关,因此不应触发编译时错误。

添加:

Java 中带标签的while/do/for 语句不是 while/do/for 语句吗?

luk*_*302 5

遵循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)

StatementLabel 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 : WhileStatementStatement -> WhileStatement!