【问题标题】:compiler behavior on curly braces and semicolon if statement花括号和分号 if 语句的编译器行为
【发布时间】:2019-03-31 12:17:09
【问题描述】:

几个月前我开始自学Java 基础(在业余水平上熟悉 PHP 好几年了)。

为了练习,我使用 OCA Java SE 8 Programmer 1 学习指南,并给出了一个示例考试问题,这让我对@987654322 中使用花括号和分号感到困惑@ 并且无法在 Java 文档中找到。

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

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

请帮忙! 提前致谢。

【问题讨论】:

    标签: java if-statement curly-braces


    【解决方案1】:

    我不明白为什么回答 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 语句之后的语句。

    【讨论】:

    • 好的,我明白了。第三行和第四行与 if 语句无关。我在 IDE 中尝试过即使没有前两行也可以编译第三行和第四行。
    【解决方案2】:

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

    来自java specification 14.6. The Empty Statement

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

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


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

    java spec 14.2. Blocks

    【讨论】:

      猜你喜欢
      • 2017-06-14
      • 1970-01-01
      • 2023-01-16
      • 2012-05-03
      • 1970-01-01
      • 2014-11-11
      • 2019-07-11
      相关资源
      最近更新 更多