java - 标签是否是 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 的示例中,theA
和B
标签都与同一个 while-loop 语句相关,因此不应触发编译时错误。
添加:
Java 中标记的 while/do/for 语句不是 while/do/for 语句吗?
解决方案
在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 : WhileStatement
与Statement -> WhileStatement
!
推荐阅读
- shell - 如何查找和计算文件类型
- c# - 如何在 .NET Core 3.1 的 Directory.Build.props 中获取 Windows 版本?
- c++ - SDL_CreateTextureFromSurface 然后 SDL_UpdateTexture 弄乱颜色
- sql - 在 postgresql 中标记日期格式的案例语句
- javascript - 如何将 react 导入我的 background.js chrome 扩展
- sql - 如何在 SQL Server 中重命名数据库?
- laravel - Laravel src/Controllers/StatisticsController.php 找不到路径
- css - 如何在 SASS 中生成动态变量
- android - 线程“主”java.lang.NoClassDefFoundError 中的异常:javax/xml/bind/annotation/XmlSchema EXCEPTION
- android - 将数据设置到启动此 nav_graph/fragment 的 nav_graph/fragment 的视图模型,而不知道是谁启动了此 nav_graph