鉴于以下有效代码:
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-statement与else上面:
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在解析时遇到的第一个?
当然,答案在Java语言规范中.相关部分是第14.5节"声明",它完全描述了这种情况:
与在C和C++中一样,Java编程语言的if语句遭受所谓的"悬空
else问题",这种错误的格式化示例说明了这一点:Run Code Online (Sandbox Code Playgroud)if (door.isOpen()) if (resident.isVisible()) resident.greet("Hello!"); else door.bell.ring(); // A "dangling else"问题是外部
if语句和内部if语句都可以设想拥有该else子句.在这个例子中,人们可能会猜测程序员希望该else子句属于外部if语句.
最后:
Java编程语言,如C和C++以及它们之前的许多编程语言,任意地规定一个
else子句属于if它可能属于的最内层.
(我强调)
| 归档时间: |
|
| 查看次数: |
2385 次 |
| 最近记录: |