首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDK的try-with-resources示例中的糟糕实践?

JDK的try-with-resources示例中的糟糕实践?
EN

Stack Overflow用户
提问于 2017-11-03 04:14:22
回答 2查看 431关注 0票数 9

我在Java的try-with-resources文档中找到了这个例子:

代码语言:javascript
复制
static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br = new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
}

如果BufferedReader的构造函数抛出异常,那么FileReader持有的资源将不会被释放。所以这不是一个糟糕的做法吗?这样写而不是:

代码语言:javascript
复制
static String readFirstLineFromFile(String path) throws IOException {
    try (FileReader fr = new FileReader(path);
         BufferedReader br = new BufferedReader(fr)) {
        return br.readLine();
    }
}
EN

回答 2

Stack Overflow用户

发布于 2017-11-03 04:25:49

实际上,我只是快速尝试了一下:

代码语言:javascript
复制
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();
    }
}

MyFileReaderMyBufferedReader都没有关闭...接得好!

在使用时:

代码语言:javascript
复制
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的权利:)

票数 1
EN

Stack Overflow用户

发布于 2017-11-03 04:20:45

不幸的是,你是对的。

下面的例子显示了这一行为-- Internal的实例永远不会关闭。

代码语言:javascript
复制
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()");
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47083895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档