我在Java的try-with-resources文档中找到了这个例子:
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}如果BufferedReader的构造函数抛出异常,那么FileReader持有的资源将不会被释放。所以这不是一个糟糕的做法吗?这样写而不是:
static String readFirstLineFromFile(String path) throws IOException {
try (FileReader fr = new FileReader(path);
BufferedReader br = new BufferedReader(fr)) {
return br.readLine();
}
}发布于 2017-11-03 04:25:49
实际上,我只是快速尝试了一下:
public class MyFileReader extends FileReader {
public MyFileReader(String fileName) throws FileNotFoundException {
super(fileName);
}
@Override
public void close() throws IOException {
System.out.println("Closing MyFileReader");
super.close();
}
}
public class MyBufferedReader extends BufferedReader {
public MyBufferedReader(Reader in) {
super(in);
throw new RuntimeException();
}
@Override
public void close() throws IOException {
System.out.println("Closing MyBufferedReader");
super.close();
}
}
public String test(String path) throws IOException {
try (BufferedReader br = new MyBufferedReader(new MyFileReader(path))) {
return br.readLine();
}
}MyFileReader和MyBufferedReader都没有关闭...接得好!
在使用时:
public String test(String path) throws IOException {
try (FileReader fr = new MyFileReader(path); BufferedReader br = new MyBufferedReader(fr)) {
return br.readLine();
}
}MyFileReader已关闭。
BufferedReader构造函数确实可以抛出异常,请参见BufferedReader(Reader in, int sz) constructor (虽然不是来自BufferedReader(Reader in) constructor,但您链接的文档仍然应该对此可能的问题发出警报)。
看起来你赢得了raise an issue的权利:)
发布于 2017-11-03 04:20:45
不幸的是,你是对的。
下面的例子显示了这一行为-- 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()");
}
}https://stackoverflow.com/questions/47083895
复制相似问题