第9條:try-with-resources優於try-finally

try-finally例子

打開文件讀取第一行spa

static String firstLineOffFile(String path) throws IOException {
        BufferedReader reader =  new BufferedReader(new FileReader(path));
        try {
            return reader.readLine();
        } finally {
            reader.close();
        }
  }

存在不足調試

  • 若是底層物理設備異常那麼reader.readLine()會異常,一樣reader.close()也會異常。這種狀況下,第二個異常會抹掉第一個異常。因第一個異常每每是問題所在,抹掉第一個異常致使調試複雜
  • 代碼繁瑣

引入try-with-resources

使用這個構造資源,必須先實現AutoCloseable接口,其中包括單個返回void的close()方法。Java類庫與第三方庫中的許多類和接口,如今都實現或擴展了AutoCloseable接口。好比BufferReader的類繼承關係code

public class BufferedReader extends Reader {
}
public abstract class Reader implements Readable, Closeable {
}
public interface Closeable extends AutoCloseable {
}

一開始的例子改造爲
static String firstLineOffFile2(String path) throws IOException {
        try (BufferedReader reader =  new BufferedReader(new FileReader(path))){
            return reader.readLine();
        }
}

 優勢blog

  • 代碼變得更簡潔易懂
  • 產生的異常更有價值,更容易診斷
相關文章
相關標籤/搜索