【问题标题】:Java: Allowed statements after labelsJava:标签后允许的语句
【发布时间】:2017-03-28 06:12:05
【问题描述】:

我正在玩 Java 语法,所以这个问题纯粹是出于好奇。这段代码:

http://www.google.com
Object val = 5 <- 4;

编译,因为标签 (http)“必须后跟声明”。以下两个变体可以编译:

http://www.google.com
{ Object val = 5 <- 4; }

Object val;
http://www.google.com
val = 5 <- 4;

在这两种情况下,我都从声明切换到了表达式。 这让我想知道 Java 中的“语句”到底是什么,但 doc 状态:

除了表达式语句,还有另外两种语句:声明语句和控制流语句。声明语句声明一个变量。

JLS 只是说(在标签上)

标识符被声明为立即包含的语句的标签。

它没有说任何关于“表达式语句”的内容。

我是否遗漏了什么,或者这只是一个不清楚/不正确的规范?

【问题讨论】:

  • "http://www.google.com" 的表达是什么?
  • @MykhayloKopytonenko 这不是一个表达式,它只是评论中的一些文字。标签是http:,然后// 开始一行注释。棘手棘手! :)
  • 代码太疯狂了!

标签: java syntax


【解决方案1】:

如果您仔细阅读 JLS 的第 14 章,您会发现 LocalVariableDeclarationStatement 不是语句。他们不是很直观,是吗?

具体来说,在JLS 14.2,我们看到:

  • 一个 Block 基本上由零个或多个 BlockStatements 组成
  • BlockStatement 是以下之一:
    • Lo​​calVariableDeclarationStatement
    • 类声明
    • 声明

因此,LocalVariableDeclarationStatement 不是层次结构中 Statement 的后代,而是兄弟姐妹。它们都是 BlockStatement 的类型。

标签后面必须跟一个真正的语句——即 BlockStatement 的特定子类型,它既不是 LocalVariableDeclarationStatement 也不是 ClassDeclaration。声明的各种子类型在14.5 中列出。您不会在其中找到 LocalVariableDeclarationStatement,但您会发现 ExpressionStatement 是 StatementWithoutTrailingSubstatement 的子类型。

【讨论】:

  • 这确实是一个非常不直观的命名选择。引用的 Section 在 Java 8 JLS 14.2 中仅略有不同(多个语句的符号已更改为类似数组的“[]”,并添加了链接)。
  • 好的,JLS 14.2 适用,因为函数体是块语句...谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 2013-01-23
  • 2018-06-09
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
相关资源
最近更新 更多