第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();
        }
}

 优点

  • 代码变得更简洁易懂
  • 产生的异常更有价值,更容易诊断

猜你喜欢

转载自www.cnblogs.com/kaituorensheng/p/10666864.html