Java语句,处理优先级("悬挂其他")

dog*_*ose 8 java if-statement

鉴于以下有效代码:

Boolean a = false;

if (a)
   System.out.println("A");
else
   System.out.println("!A");
Run Code Online (Sandbox Code Playgroud)

现在,根据文档if包括它的条件和内部statement也是一个statement(https://docs.oracle.com/javase/tutorial/java/nutsandbolts/if.html - 至少它被称为statement全文档)

例如:

   if (b){
      System.out.println("B");
   }
Run Code Online (Sandbox Code Playgroud)

是一个statement.

但是,当我们要用另一个语句替换现有语句时,它不应该触及整体逻辑,对吧?假设我们更换(表达) - if-statementelse上面:

Boolean a = false;
Boolean b = false:

if (a)
   if (b){
      System.out.println("A and B");
   }
else
   System.out.println("!A");
Run Code Online (Sandbox Code Playgroud)

Java编译器将如下解释代码示例(完整的大括号用于解释):

Boolean a = false;
Boolean b = false:

if (a){
   if (b){
      System.out.println("A and B");
   } else {
      System.out.println("!A");
   }
}
Run Code Online (Sandbox Code Playgroud)

这不是最初的逻辑.

那么为什么要交换一个声明而另一个声明改变逻辑呢?

从示例中可以清楚地看出,问题仅仅是关于括号,但是我无法找到关于java正是如何处理这个问题的信息,如果有大括号的话.

因此,如果有任何关于这种行为的记录,我只是感兴趣吗?为什么java更喜欢连接if到更新的if,而不是if在解析时遇到的第一个?

Mar*_*o13 8

当然,答案在Java语言规范中.相关部分是第14.5节"声明",它完全描述了这种情况:

与在C和C++中一样,Java编程语言的if语句遭受所谓的"悬空else问题",这种错误的格式化示例说明了这一点:

if (door.isOpen())
    if (resident.isVisible())
        resident.greet("Hello!");
else door.bell.ring();  // A "dangling else"
Run Code Online (Sandbox Code Playgroud)

问题是外部if语句和内部if语句都可以设想拥有该else子句.在这个例子中,人们可能会猜测程序员希望该else子句属于外部if语句.

最后:

Java编程语言,如C和C++以及它们之前的许多编程语言,任意地规定一个else子句属于if它可能属于的最内层.

(我强调)