良好的程式碼規範是專業 Java 開發的基石。本文整理了開發中常見的中級規範,涵蓋資源管理、控制流程、異常處理、命名慣例等核心領域,助你編寫更健壯、可維護的高品質代碼。
當方法中建立 InputStream 或 OutputStream 時,必須在 finally 區塊確保其關閉,防止系統資源洩漏。即使發生異常,也能保證資源釋放。
例外情況: 以下類別的 close() 無實際作用,無需強制關閉:
java.io.StringWriterjava.io.ByteArrayOutputStreamjava.io.ByteArrayInputStreampublic void method(File f) {
FileInputStream fis = null;
try {
fis = new FileInputStream(f);
fis.read();
fis.close(); // 若 read() 拋出異常,close() 不會執行
} catch (FileNotFoundException e) { ... }
catch (IOException e) { ... }
}
public void method(File f) {
FileInputStream fis = null;
try {
fis = new FileInputStream(f);
fis.read();
} catch (FileNotFoundException e) { ... }
catch (IOException e) { ... }
finally {
if (fis != null) {
try { fis.close(); }
catch (IOException e) { ... }
}
}
}
提示:Java 7+ 可使用 try-with-resources 語法自動管理資源,更為簡潔。
巢狀 if 搭配 else 時,省略大括號會導致「懸空 else」歧義。強制使用 {} 可消除歧義,提升可讀性。
// 錯誤
if (i < 5)
if (i < 2) i++;
else i--;
// 正確
if (i < 5) {
if (i < 2) i++;
} else {
i--;
}
catch 區塊至少應記錄錯誤資訊或採取補救措施。僅允許包含 Javadoc 註解的空實作。
// 錯誤
catch (IOException e) { }
// 正確
catch (IOException e) {
logger.error("讀取失敗", e);
}
Java 中 if (b = true) 會編譯報錯,務必使用 == 比較,防止邏輯錯誤。
for (i=0; i<10; i++); 結尾的分號導致迴圈主體為空,僅執行一次。正確寫法:
for (i = 0; i < 10; i++) {
System.out.println(i);
}
main 為 JVM 保留入口點,自定義同名方法易造成混淆。
自定義異常應繼承 Exception。繼承 Error 會誤導編譯器視為 JVM 內部錯誤,導致異常檢查失效。
// 錯誤
public class ABC extends Error { }
// 正確
public class ABC extends Exception { }
避免「貫穿」導致非預期邏輯。最後一個 default 亦建議加上 break,便於後續擴充。
並非所有平台皆支援環境變數,建議改用 System.getProperty() 獲取系統屬性,確保跨平台相容性。
避免硬編碼 \n 或 \r。推薦使用:
System.out.println() 自動處理換行System.getProperty("line.separator") 獲取平台專屬換行符Java 編譯器將內部類編譯為 package-private 類別,若不加 private,同包其他類別可存取外部類私有成員,破壞封裝性。
序列化介面會暴露實作類別的私有狀態,造成安全風險。