行业资讯 2025年08月6日
0 收藏 0 点赞 677 浏览 1565 个字
摘要 :

文章目录 1.旧方法(Java 7之前) 2. try-with-resources 3.运行原理 4。结论 Java 7 中引入的try-with-resources语句允许我们声明要在try块中使用的 AutoCloseable资……




  • 1.旧方法(Java 7之前)
  • 2. try-with-resources
  • 3.运行原理
  • 4。结论

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.zuozi.net/9147.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号