陷阱 - 返回 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;
    }

}

那有什麼問題呢?

問題是 getReadernull 作為一個特殊值返回,表示 Reader 無法開啟。現在需要測試返回值以檢視它是否在使用之前是 null。如果省略測試,結果將是一個 NullPointerException

這裡實際上有三個問題:

  1. IOException 很快被捕捉了。
  2. 此程式碼的結構意味著存在洩漏資源的風險。
  3. 使用 null 然後返回,因為沒有真正的Reader 可用於返回。

事實上,假設異常確實需要像這樣早點發現,有幾種方法可以返回 null

  1. 可以實現 NullReader 類; 例如,API 的操作就像讀者已經處於檔案結束位置一樣。
  2. 使用 Java 8,可以將 getReader 宣告為返回 Optional<Reader>