陷阱 - 錯誤的分號和缺失的括號

這是一個錯誤,導致 Java 初學者真正的困惑,至少他們第一次這樣做。而不是寫這個:

if (feeling == HAPPY)
    System.out.println("Smile");
else
    System.out.println("Frown");

他們不小心寫了這個:

if (feeling == HAPPY);
    System.out.println("Smile");
else
    System.out.println("Frown");

當 Java 編譯器告訴他們 else 錯位時,他們感到困惑。Java 編譯器解釋如下:

if (feeling == HAPPY)
    /*empty statement*/ ;
System.out.println("Smile");   // This is unconditional
else                           // This is misplaced.  A statement cannot
                               // start with 'else'
System.out.println("Frown");

在其他情況下,不會出現編譯錯誤,但程式碼不會執行程式設計師的意圖。例如:

for (int i = 0; i < 5; i++);
    System.out.println("Hello");

只列印一次你好。再一次,錯誤的分號意味著 for 迴圈的主體是一個空的陳述。這意味著隨後的 println 呼叫是無條件的。

另一種變化:

for (int i = 0; i < 5; i++);
    System.out.println("The number is " + i);

這將為 i 提供無法找到符號錯誤。錯誤的分號的存在意味著 println 呼叫試圖在其範圍之外使用 i

在這些示例中,有一個直接的解決方案:只需刪除偽分號。但是,從這些例子中可以得出一些更深刻的教訓:

  1. Java 中的分號不是語法噪音。分號的存在與否可以改變程式的含義。不要只是在每一行的末尾新增它們。

  2. 不要相信你的程式碼縮排。在 Java 語言中,編譯器會忽略行開頭的額外空格。

  3. 使用自動壓頭。所有 IDE 和許多簡單的文字編輯器都瞭解如何正確縮排 Java 程式碼。

  4. 這是最重要的一課。遵循最新的 Java 風格指南,並在 thenelse 語句以及迴圈的 body 語句周圍新增大括號。開口支撐({)不應該在新的線上。

如果程式設計師遵循樣式規則那麼帶有錯誤分號的 if 示例將如下所示:

if (feeling == HAPPY); {
    System.out.println("Smile");
} else {
    System.out.println("Frown");
}

對於有經驗的人來說這看起來很奇怪如果你自動縮排該程式碼,它可能看起來像這樣:

if (feeling == HAPPY); {
                           System.out.println("Smile");
                       } else {
                           System.out.println("Frown");
                       }

這對於初學者來說應該是錯誤的。