第9条:try-with-resources优于try-finally
try-finally例子
打开文件读取第一行
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的类继承关系
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(); } }
优点
- 代码变得更简洁易懂
- 产生的异常更有价值,更容易诊断