花括号和分号 if 语句的编译器行为

compiler behavior on curly braces and semicolon if statement

几个月前开始自学Java基础知识(业余水平熟悉PHP好几年)

为了练习,我使用 OCA Java SE 8 Programmer 1 学习指南 并给出了一个示例试题,这让我对 使用if-statement 中的花括号和分号 并且在 Java 文档 .

中找不到

我不明白为什么允许回答 E 并编译。
我已经尝试在 Netbeans 10 (JDK 11) 中评估警告和提示,但并没有让我理解基础。
还尝试将编译的多个组合(仅警告 Empty statement)。
if (true) ; {;;{}{}{}} ;;;;;;;;
if (true) ;;{}{{}{}{}}; {;;{}{}{}} ;;;;;;;;
if (true) ;;{}{{}{}{}}; {;;{}{}{}}

问题:下面哪个语句不能编译?
A. if (true) ;
B. if (true) {}
C.if (true) {;}
D. if (true) {;;}
E. if (true) ; {} ;
F. All statements will compile(=正确答案)

请帮忙! 提前致谢。

回答E会编译,因为符号;在java中是允许的语句。在这种情况下 if 语句只有空体,没有任何意义,但它是有效的。

来自java specification 14.6. The Empty Statement

An empty statement does nothing. EmptyStatement: ;

Execution of an empty statement always completes normally.


{} 只是一个空代码块,在 java 中也是允许的。

java spec 14.2. Blocks

I do not understand why answer E is allowed and compiles.

在 Java 中,; 可以是语句终止符或空语句,具体取决于上下文。

以下是选项 E 中的(有效)Java 代码的解析方式:

  if (true) // <-- "if" and its condition
  ;         // an empty statement which is the "then" part of the "if"
  {}        // an (empty) block statement
  ;         // an empty statement

前两行是完整的 if 语句。第三行和第四行是 if 语句之后的语句。