陷阱 - 返回 null 而不是丟擲異常
一些 Java 程式設計師普遍厭惡丟擲或傳播異常。這導致程式碼如下:
public Reader getReader(String pathname) {
try {
return new BufferedReader(FileReader(pathname));
} catch (IOException ex) {
System.out.println("Open failed: " + ex.getMessage());
return null;
}
}
那有什麼問題呢?
問題是 getReader
將 null
作為一個特殊值返回,表示 Reader
無法開啟。現在需要測試返回值以檢視它是否在使用之前是 null
。如果省略測試,結果將是一個 NullPointerException
。
這裡實際上有三個問題:
IOException
很快被捕捉了。- 此程式碼的結構意味著存在洩漏資源的風險。
- 使用
null
然後返回,因為沒有真正的Reader
可用於返回。
事實上,假設異常確實需要像這樣早點發現,有幾種方法可以返回 null
:
- 可以實現
NullReader
類; 例如,API 的操作就像讀者已經處於檔案結束位置一樣。 - 使用 Java 8,可以將
getReader
宣告為返回Optional<Reader>
。