陷阱 - 丟擲懸掛的懸掛和其他問題

最新版本的 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 程式設計師來說都看起來不對