首页 > 其他分享 >使用try-with-resource 的情况下,resource 进入catch 块或者 finally 块之前,已经关闭了吗

使用try-with-resource 的情况下,resource 进入catch 块或者 finally 块之前,已经关闭了吗

时间:2024-10-08 14:25:55浏览次数:7  
标签:resource try finally 关闭 catch 异常 资源

在 Java 中,使用 try-with-resources 的情况下,资源会在 try 块执行完毕后自动关闭。具体来说,无论是否发生异常,资源总是在控制流进入 catchfinally 块之前关闭

关键点:

  1. try-with-resources 是在 try 语句中声明和管理实现了 AutoCloseable 接口的资源,例如 InputStreamOutputStreamConnection 等。
  2. try 块执行完毕后,无论是正常结束还是抛出异常,资源都会在进入 catchfinally 块之前自动关闭。
  3. 如果抛出了异常,资源的关闭操作会在 catch 块之前进行。因此,当进入 catch 块时,资源已经被安全关闭了。

执行顺序:

  • 正常执行try 块中的代码执行完毕,资源被关闭,然后进入 finally 块(如果有)。
  • 异常情况:当 try 块中抛出异常,资源依然会在异常传播到 catch 块之前关闭。

示例代码:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class TryWithResourcesExample {

    public static void main(String[] args) {
        try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
            // 读取文件
            String line = reader.readLine();
            System.out.println(line);
            // 假设这里发生了异常
            throw new RuntimeException("Exception in try block");
        } catch (Exception e) {
            // 进入 catch 块之前,资源已经关闭
            System.out.println("Exception caught: " + e.getMessage());
        } finally {
            System.out.println("Finally block executed");
        }
    }
}

执行流程:

  1. try 块中打开文件并读取一行。
  2. 如果 try 块中发生异常(例如 throw new RuntimeException),BufferedReader 会在异常抛出并传播到 catch 块之前被关闭。
  3. 异常被捕获后,进入 catch 块处理异常。
  4. 最后执行 finally 块。

输出:

Exception caught: Exception in try block
Finally block executed

说明:

  • 当异常抛出时,资源 BufferedReader 会在进入 catch 块之前被关闭。
  • 即使 try 块中没有异常,资源也会在 try 块执行完毕后关闭,然后再进入 finally 块。

总结:

  • 资源总是在进入 catch 块或 finally 块之前关闭,这意味着你不需要在 catchfinally 块中手动关闭资源。
  • 这就是 try-with-resources 的优势,确保资源可以自动、安全地关闭,不论是否发生异常。

标签:resource,try,finally,关闭,catch,异常,资源
From: https://www.cnblogs.com/gongchengship/p/18451545

相关文章

  • 使用apatch httpClient, 并且我用了try-with-resource, 我希望在catch 和 finally 中从
    在使用ApacheHttpClient时,如果你使用了try-with-resources语法并希望在catch或finally块中从response对象中读取完整的responseentity,你可能会遇到资源过早关闭的问题。这是因为try-with-resources会在try块结束后自动关闭资源,导致在catch或finally块中无法......
  • CloseableHttpResponse当程序进入 catch 块的情况下,就不得不在catch 中获取entity,这
    如果程序进入catch块时还需要获取responseentity,但此时try-with-resources会自动关闭资源,导致无法再从response中获取数据,这种情况下,你可以避免在try-with-resources中立即关闭CloseableHttpResponse,并延迟处理资源的关闭。为了解决这个问题,下面是几种可行的方式:1.......
  • Ubuntu20.04安装LabelImg 以及出现(ModuleNotFoundError: No module named libs.resour
    安装Ubuntu系统安装labelImg:sudoaptinstallpyqt5-dev-tools接下来,通过GitHub下载LabelImg:gitclonehttps://github.com/tzutalin/labelImg.gitcdlabelimg-mastercdrequirements/sudopip3install-rrequirements-linux-python3.txt-ihttps://pypi.tuna.tsing......
  • 帝国CMS后台添加信息报错Duplicate entry xx for key PRIMARY
    当在帝国CMS后台添加信息时遇到 Duplicateentry'xx'forkey'PRIMARY' 的错误时,通常是因为主键冲突。以下是一些解决该问题的方法:方法1:后台修复数据库进入后台:登录帝国CMS后台。进入 系统 -> 备份与恢复数据 -> 备份数据。修复数据表:在页面底部,找到 修复......
  • @ImportResource用法
    用法@ImportResource注解用于导入Spring的配置文件,让某个配置文件中的bean生效;SpringBoot里没有Spring的配置文件,自己可以手动编写配置文件,但SpringBoot不能自动识别,此时需要在配置类中引入编写的配置文件注意:这个配置文件生效需要放在配置类上!!举个例子:测试SpringBoo......
  • TryOnDiffusion——生成拟合图像的最强大模型
    介绍论文地址:https://arxiv.org/pdf/2306.08276虚拟试穿是以人的图像和服装的图像为基础,目的是想象服装穿在人身上的效果。虚拟试穿可以改善网上购物体验,但大多数传统试穿方法只有在身体姿势和形状变化较小时才能奏效。主要的挑战在于如何根据目标体形对服装进行非刚性变......
  • WPF FindResource,Resource[key] SystemColors TryFindResource
    //xaml<Windowx:Class="WpfApp3.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.micr......
  • async/await 函数到底要不要加 try catch ?
    前言写异步函数的时候,promise和async两种方案都非常常见,甚至同一个项目里,不同的开发人员都使用不同的习惯,不过关于两者的比较不是本文关注的重点,只总结为一句话:“async是异步编程的终极解决方案”。当使用async函数的时候,很多文章都说建议用trycatch来捕获异常,可是......
  • Hadoop集群的高可用(HA):NameNode和resourcemanager高可用的搭建
    文章目录一、NameNode高可用的搭建1、免密配置2、三个节点都需要安装psmisc3、检查三个节点是否都安装jdk以及zk4、检查是否安装了hadoop集群5、修改hadoop-env.sh6、修改core-site.xml7、修改hdfs-site.xml8、检查workers文件是否为三台服务9、分发给其他两个节点10、......
  • CHI trans简介--Retry
    总目录:CHI协议简读汇总-CSDN博客Retrytransflowrequester发送一个请求,该请求没有protocolcredit(P-Credit);也就是说,该请求不保证completer一定能够接收该trans;completer返回一个retryresp,RetryAck,给到Requester;completer再发送一个protocolcreditgrant,PCr......