陷阱 - 錯誤的分號和缺失的括號
這是一個錯誤,導致 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
。
在這些示例中,有一個直接的解決方案:只需刪除偽分號。但是,從這些例子中可以得出一些更深刻的教訓:
-
Java 中的分號不是語法噪音。分號的存在與否可以改變程式的含義。不要只是在每一行的末尾新增它們。
-
不要相信你的程式碼縮排。在 Java 語言中,編譯器會忽略行開頭的額外空格。
-
使用自動壓頭。所有 IDE 和許多簡單的文字編輯器都瞭解如何正確縮排 Java 程式碼。
-
這是最重要的一課。遵循最新的 Java 風格指南,並在
then
和else
語句以及迴圈的 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");
}
這對於初學者來說應該是錯誤的。