陷阱 - 抛出悬挂的悬挂和其他问题

最新版本的 Oracle Java 样式指南要求 if 语句中的 thenelse 语句应始终包含在大括号大括号中。类似的规则适用于各种循环语句的主体。

if (a) {           // <- open brace
    doSomething();
    doSomeMore();
}                  // <- close brace

Java 语言语法实际上并不需要这样做。实际上,如果 if 陈述的当时部分是单一陈述,则省略括号是合法的

if (a)
    doSomething();

甚至

if (a) doSomething();

但是,忽略 Java 样式规则并省略括号存在危险。具体而言,你会显着增加带有错误缩进的代码被误读的风险。

****晃来晃去的问题:

考虑上面的示例代码,重写没有大括号。

if (a)
   doSomething();
   doSomeMore();

这段代码似乎说,当 atrue 发生时, doSomethingdoSomeMore 的调用都会发生。实际上,代码拼写错误。doSomeMore() 调用的 Java 语言规范是在 if 语句之后的单独语句。正确的缩进如下:

if (a)
   doSomething();
doSomeMore();

****悬空的问题

当我们将 else 添加到混音中时会出现第二个问题。请考虑以下带有大括号的示例。

if (a)
   if (b)
      doX();
   else if (c)
      doY(); 
else
   doZ();

上面的代码似乎说afalse 时会调用 doZ。实际上,缩进再次不正确。代码的正确缩进是:

if (a)
   if (b)
      doX();
   else if (c)
      doY(); 
   else
      doZ();

如果代码是根据 Java 样式规则编写的,它实际上看起来像这样:

if (a) {
   if (b) {
      doX();
   } else if (c) {
      doY(); 
   } else {
      doZ();
   }
}

为了说明为什么更好,假设你不小心错误地缩进了代码。你最终会得到这样的东西:

if (a) {                         if (a) {
   if (b) {                          if (b) {
      doX();                            doX();
   } else if (c) {                   } else if (c) {
      doY();                            doY();
} else {                         } else {
   doZ();                            doZ();
}                                    }
}                                }

但在这两种情况下,错误缩进的代码对于经验丰富的 Java 程序员来说都看起来不对