当前位置: 首页 > article >正文

如何使用 try-with-resources

如何使用 try-with-resources 代替try-catch-finally?

适用范围(资源的定义): 任何实现 java.lang.AutoCloseable或者 java.io.Closeable 的对象关闭资源和 finally 块的执行顺序: 在 try-with-resources 语句中,任何 catch 或 finally 块在声明的资源关闭后运行
《Effective Java》中明确指出:

面对必须要关闭的资源,我们总是应该优先使用 try-with-resources 而不是try-finally。随之产生的代码更简短,更清晰,产生的异常对我们也更有用。try-with-resources语句让我们更容易编写必须要关闭的资源的代码,若采用try-finally则几乎做不到这点。

Java 中类似于InputStream、OutputStream、Scanner、PrintWriter等的资源都需要我们调用close()方法来手动关闭,一般情况下我们都是通过try-catch-finally语句来实现这个需求,如下:

//读取文本文件的内容
Scanner scanner = null;
try {
    scanner = new Scanner(new File("D://read.txt"));
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
} finally {
    if (scanner != null) {
        scanner.close();
    }
}

使用 Java 7 之后的 try-with-resources 语句改造上面的代码:

try (Scanner scanner = new Scanner(new File("test.txt"))) {
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException fnfe) {
    fnfe.printStackTrace();
}

当然多个资源需要关闭的时候,使用 try-with-resources 实现起来也非常简单,如果你还是用try-catch-finally可能会带来很多问题。通过使用分号分隔,可以在try-with-resources块中声明多个资源。

try (BufferedInputStream bin = new BufferedInputStream(new FileInputStream(new File("test.txt")));
     BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(new File("out.txt")))) {
    int b;
    while ((b = bin.read()) != -1) {
        bout.write(b);
    }
}
catch (IOException e) {
    e.printStackTrace();
}

著作权归JavaGuide(javaguide.cn)所有
基于MIT协议
原文链接:https://javaguide.cn/java/basis/java-basic-questions-03.html


http://www.kler.cn/a/153274.html

相关文章:

  • 如何下载IEEE出版社的Journal/Conference/Magazine的LaTeX/Word模板
  • 深度解析 Dockerfile:构建可重复、可扩展的Docker镜像
  • 麒麟v10系统arm64架构openssh9.5p1安装
  • 现货白银简单介绍
  • PgSQL技术内幕 • statement_timeout做的那些事
  • Spring Boot 统⼀数据返回格式
  • 前端面试高频考点—事件循环Event loop
  • 『heqingchun-Ubuntu系统+x86架构+配置编译安装使用yolov5-6.0+带有TensorRT硬件加速+封装动态库+C++部署+Qt』
  • 登录/注册波形库账号(英国Pico汽车论坛账号)
  • 2023-12-01 AIGC-自动生成ppt的AI工具
  • C#多线程开发之----List Task有返回值
  • RPG项目01_场景及人物动画管理器
  • 【零基础入门Docker】Dockerfile中的USER指令以及dockerfile命令详解
  • C++ 传递指针给函数
  • 从PDF和图像中提取文本,以供大型语言模型使用
  • java开发之个微群聊自动添加好友
  • scrapy爬虫中间件和下载中间件的使用
  • git基本概念
  • 【概率统计】如何理解概率密度函数及核密度估计
  • Doris 数据导入一:Broker Load 方式