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

问题描述 投票:-2回答:2

几个月前我开始学习自己的Java基础知识(熟悉PHP几年的业余水平)。

为了练习,我使用了OCA Java SE 8程序员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(=正确答案)

请帮忙!提前致谢。

java if-statement curly-braces
2个回答
2
投票

我不明白为什么回答E是允许和编译。

在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声明之后的声明。


0
投票

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

来自java specification 14.6. The Empty Statement

空语句什么都不做。 EmptyStatement:;

执行空语句总是正常完成。


{}只是java中允许的空代码块。

java spec 14.2. Blocks

© www.soinside.com 2019 - 2024. All rights reserved.