编程语言
首页 > 编程语言> > 标签是否是Java语句?

标签是否是Java语句?

作者:互联网

标签是否是Java语句,标签是否是在Java语言规范中定义为语句的语句?

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

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

In case of e.g.:
A: B: while (true) continue A; the statement on which the “continue” is applied is not “while (true) continue A;“, but “B: while (true) continue A;“, and the spec requires the target for continue is a while/do/for statement, which is not fulfilled here. Hence the compile-time error.

我认为Java中的标签不是一个语句,在Jan的例子中,A和B标签都与同一个while循环语句相关,因此不应该触发编译时错误.

加成:

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

解决方法:

JLS之后,声明可以

StatementWithoutTrailingSubstatement
LabeledStatement
IfThenStatement
IfThenElseStatement
WhileStatement
ForStatement

与LabeledStatement一样

Identifier : Statement

并说明

The Identifier is declared to be the label of the immediately contained Statement

所以在循环的情况下

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

Label的语句loop1是整个loop2 ……的东西.

如果我们看一下break的定义,就说明了

the break target need not be a switch, while, do, or for statement.

而对于继续它说

The continue target must be a while, do, or for statement, or a compile-time error occurs.

这些定义与编译器一致,为continue loop1语句提供编译器错误,并且让break loop1有效,因为loop2:…不是“while,do或for语句”.

关于你的实际问题:标签是否是Java声明?

以下代码完全合法,编译良好

public void method() {
    loop:;
}

这遵循Statement – >的扩展. LabeledStatement – >标识符:声明 – > loop:Statement – > loop:StatementWithoutTrailingSubstatement – > loop:EmptyStatement – >

loop : ;

不,标签本身没有声明,标识符(后来称为“标签”)加上colom加上EmptyStatement(;)然而.

在/ a / do / for语句中没有标记/ do / for语句吗?

没有!
LabeledStatement就是这样的:LabeledStatement. A标记为声明 – >标签 – >标识符:声明 – >标识符:WhileStatement与Statement基本不同 – > WhileStatement!

标签:jls,java
来源: https://codeday.me/bug/20190731/1586532.html