首页 > 解决方案 > 标签是否是 Java 语句?

问题描述

标签是否是 Java 语句,如果标签是语句,它在 Java 语言规范中定义为语句吗?

我的问题与我发送给 Oracle 的错误报告中 Jan Lahoda 的以下回复有关。我无法在那里讨论它,因为我无法在 OpenJDK Jira 中获得帐户。

https://bugs.openjdk.java.net/browse/JDK-8211052

例如: A: B: while (true) continue A;应用“继续”的语句不是“ while (true) continue A;”,而是“ B: while (true) continue A;”,并且规范要求 continue 的目标是 while/do/for 语句,此处不满足。因此编译时错误。

我认为 Java 中的标签不是语句,在 Jan 的示例中,theAB标签都与同一个 while-loop 语句相关,因此不应触发编译时错误。

添加:

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

标签: javajls

解决方案


JLS之后aStatement可以

StatementWithoutTrailingSubstatement
LabeledStatement
IfThenStatement
IfThenElseStatement
WhileStatement
ForStatement

LabeledStatement存在

Identifier : Statement

并声明

Identifier 被声明为立即包含的 Statement 的标签

所以在像这样的循环的情况下

public void method() {
    loop1: loop2: while (true) {
        if (true) {
            break loop1;
        } else {
            continue loop1;
        }
    }
}

Statement就是Label loop1全部的loop2 ...东西。

如果我们看一下它的定义,break则表明

break 目标不必是 switch、while、do 或 for 语句。

而对于continue它来说

continue 目标必须是 while、do 或 for 语句,否则会发生编译时错误。

这些定义正确地符合编译器为continue loop1语句提供编译器错误并break loop1使其有效,因为它loop2: ...不是while、do 或 for 语句”


关于您的实际问题:标签是否是Java语句?

下面的代码是完全合法的并且编译得很好

public void method() {
    loop:;
}

这遵循Statement-> LabeledStatement-> Identifier: Statement-> loop : Statement-> loop : StatementWithoutTrailingSubstatement-> loop : EmptyStatement->的扩展

loop : ;

不,标签本身不是语句,但标识符(然后称为“标签”)加上一个colom加上一个EmptyStatement;)是。


Java中的while/do/for语句不是标记为while/do/for语句吗?

不!
ALabeledStatement就是这样:a LabeledStatement。带标签的 whileStatement -> Label -> Identifier : Statement -> Identifier : WhileStatementStatement -> WhileStatement!


推荐阅读