Mon*_*Kin 9 java try-with-resources
我在Java 的try-with-resources文档中找到了这个例子:
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}
Run Code Online (Sandbox Code Playgroud)
如果构造函数BufferedReader抛出异常,则FileReader不会释放由其持有的资源.所以这不是一个不好的做法,而不是:
static String readFirstLineFromFile(String path) throws IOException {
try (FileReader fr = new FileReader(path);
BufferedReader br = new BufferedReader(fr)) {
return br.readLine();
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,你是对的。
下面的示例显示了这种行为 - 的实例Internal永远不会关闭。
public class Test {
public static void main(String[] args) {
try (External external = new External(new Internal())) {
}
}
}
class External implements Closeable {
private Internal internal;
public External(Internal internal) {
this.internal = internal;
throw new RuntimeException("boom");
}
@Override
public void close() {
System.out.println("External.close()");
internal.close();
}
}
class Internal implements Closeable {
@Override
public void close() {
System.out.println("Internal.close()");
}
}
Run Code Online (Sandbox Code Playgroud)