Java try-with-resources 代码示例详解

培训教学 潘老师 8个月前 (08-29) 187 ℃ (0) 扫码查看

Java 7 中引入的try-with-resources语句允许我们声明要在try块中使用的 AutoCloseable资源 ,并保证在执行try块后资源将被关闭。

1.旧方法(Java 7之前)

在 Java 7 之前,如果我们打开一个资源,就必须使用try-catch-finally块。我们在try块中打开资源并在finally块中关闭它。JVM保证会执行finally块,因此我们知道即使在try块中出现异常,资源也会被关闭。

在下面的示例中,我们使用BufferedReader逐行读取文件。请注意我们如何在try块中打开读取器,然后在finally块中将其关闭。

BufferedReader br = null;

try {
    String sCurrentLine;
    br = new BufferedReader(new FileReader("C:/temp/test.txt"));
    while ((sCurrentLine = br.readLine()) != null) {
        System.out.println(sCurrentLine);
    }
} catch (IOException e) {
    //handle exception
} finally {
    try {
        if (br != null)
            br.close();
    }
    catch (IOException ex) {
        ex.printStackTrace();
    }
}

在上面的示例中,finally 块是一个用于关闭资源的标准实现。你难道不觉得当我们明确知道关闭资源不会出现异常时,finally 块是不必要的吗?

2. try-with-resources

让我们使用新的try-with-resources语法重写前面的示例。看看代码有多简洁。

try (BufferedReader br = new BufferedReader(new FileReader("C:/temp/test.txt"))) {
    String sCurrentLine;
    while ((sCurrentLine = br.readLine()) != null) {
        System.out.println(sCurrentLine);
    }
}
catch (IOException e) {
    //handle exception
}

有两件事需要密切关注:

  1. 文件资源(BufferedReader)以特殊方式在try块中打开(在小括号内部)。
  2. finally 块完全消失了。

一个重要的事情是,我们不应该手动调用close()方法。这应该由JVM自动调用。手动调用close()方法可能会导致意外结果。

3.运行原理

Java 7引入了一个新的超级接口java.lang.AutoCloseable,它可以保存资源(比如文件或套接字句柄),直到被关闭为止。这个接口有一个名为close()的方法,当退出一个声明了该对象的try块时,该方法会被自动调用。

void close() throws Exception;

例如,BufferedReader已经实现了 close() 方法文件:

public void close() throws IOException {
    synchronized (lock) {
        if (in == null)
            return;
        in.close();
        in = null;
        cb = null;
    }
}

4。结论

让我们逐点回顾要点:

  1. 在Java 7之前,我们必须使用finally块来清理资源。虽然finally块不是强制性的,但资源清理是为了防止系统损坏。

  2. 在Java 7中,不再需要显式地进行资源清理。使用try-with-resources语句时,资源会自动清理。

  3. 清理是因为新的AutoCloseable接口。它的close()方法在try块完成后由JVM调用。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/teach/8470.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】