📜  Java7 try-with-resources(1)

📅  最后修改于: 2023-12-03 15:16:03.055000             🧑  作者: Mango

Java7 try-with-resources

在Java7之前,当程序中使用需要关闭的资源(如数据库连接、I/O流等)时,通常需要使用try-catch-finally语句块来确保正确地关闭这些资源。这可能会导致代码变得冗长且难以阅读。Java7引入了try-with-resources语句,可以显著地简化此过程。

什么是try-with-resources

try-with-resources是一个新的Java7语言结构,它是一种自动关闭资源的方便方法。这个结构使得在try块外部接管关闭资源的任务不再必要,从而降低了代码出错的风险。

如何使用try-with-resources

在try-with-resources结构中,可以使用以"类似于"语法来自动关闭资源。下面是一些示例代码:

//传统写法
BufferedReader reader = null;
try {
    reader = new BufferedReader(new FileReader("test.txt"));
    String line = reader.readLine();
    while (line != null) {
        System.out.println(line);
        line = reader.readLine();
    }
} catch (IOException ex) {
    ex.printStackTrace();
} finally {
    if (reader != null) {
        try {
            reader.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

//try-with-resources写法
try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) {
    String line = reader.readLine();
    while (line != null) {
        System.out.println(line);
        line = reader.readLine();
    }
} catch (IOException ex) {
    ex.printStackTrace();
}

在传统写法中,我们需要在try-catch-finally块中打开资源,在finally块中关闭它。在try-with-resources写法中,资源会在try块之后自动关闭。这意味着:即使代码在try块中抛出异常,也可以安全地关闭资源。

当使用多个资源的时候,也可以在try-with-resources块中定义多个资源。多个资源的定义应该以分号分隔。示例如下:

try (
    BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
    BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))
) {
    String line = reader.readLine();
    while (line != null) {
        writer.write(line);
        writer.newLine();
        line = reader.readLine();
    }
} catch (IOException ex) {
    ex.printStackTrace();
}

##try-with-resources的要求

try-with-resources有两个要求:

  • 资源必须实现java.lang.AutoCloseable接口

  • 在try-with-resources块中声明的变量必须是资源对象,并且只能声明资源对象

##比较try-catch-finally与try-with-resources

下面的表格给出了两种写法的区别:

| 写法 | try-catch-finally | try-with-resources | | :--------: | :------------------------------------------: | :------------------------------------------: | | 关闭 | finally块中关闭 | 结束后自动关闭 | | 自定义Close | 得以实现 | 在try-with-resources块中禁止 | | 可读性 | 差 | 优 | | 核心代码 | try块            catch块 | try块         - |

结论

使用try-with-resources结构可以显著简化代码,使其更加易于阅读和理解。try-with-resources在自动关闭资源方面确保了代码的安全性,并减少了出错的机会。为了使用try-with-resources块,你需要确保你的资源对象实现了AutoCloseable接口。