JDK的try-with-resources示例中的不良做法?

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)

Ada*_*ski 0

不幸的是,你是对的。

下面的示例显示了这种行为 - 的实例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)

  • 该示例中未使用其他构造函数。 (2认同)