try-cache-finally读取文件错误try-with-resources使用方法

 更新时间:2023年02月13日 09:13:45   作者:全村最野的狗  
这篇文章主要为大家介绍了try-cache-finally读取文件错误try-with-resources使用方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

前些天项目经理找到我说,阿杰,你过来一下,我这有个小方法,你帮我写一下

  • 需求: 提供一个文本文件,按行读取,然后给出一个回调函数,可以由调用者去实现对每行的处理.

我就想,你这不是瞧不起我吗.5分钟搞定!!嘴里却说,你这个有点难,我需要研究下大概今天下班前能完成.

5分钟过去了----> 代码完成

摸鱼3小时 ----> ok 代码一发,收工准备下班

public void clean2(String path, Consumer<String> consumer){
    FileReader fileReader = null;
    BufferedReader br = null;
    try{
        fileReader = new FileReader(path);
        br = new BufferedReader(fileReader);
        String line;
        while((line = br.readLine()) != null ){
            consumer.accept(line);
        }
    }catch (IOException e){
        // do
    }finally {
        try {
            if (br != null){
                br.close();
            }
            if (fileReader != null){
                fileReader.close();
            }
        } catch (IOException e) {
            // do
        }
    }
}

项目经理 😶😶😶😶: 你tm明天别来了,自己去财务把这个月的结了,3行代码就写完的功能写成这个鬼样子.

那我就想啊,我写的这么完美,那凭什么开除我,经过我九九八十一天的苦思冥想,终于找到了问题的原因!!

try-cache-finally

try-finally 是java SE7之前我们处理一些需要关闭的资源的做法,无论是否出现异常都要对资源进行关闭。*

如果try块和finally块中的方法都抛出异常那么try块中的异常会被抑制(suppress),只会抛出finally中的异常,而把try块的异常完全忽略。

这里如果我们用catch语句去获得try块的异常,也没有什么影响,catch块虽然能获取到try块的异常但是对函数运行结束抛出的异常并没有什么影响。

try-with-resources

try-with-resources语句能够帮你自动调用资源的close()函数关闭资源不用到finally块。

前提是只有实现了Closeable接口的才能自动关闭

public void clean(String path, Consumer<String> consumer) throws IOException {
    try (BufferedReader br = new BufferedReader(new FileReader(path))) {
        String line;
        while((line = br.readLine()) != null ){
            consumer.accept(line);
        }
    }
}

这是try-with-resources语句的结构,在try关键字后面的( )里new一些需要自动关闭的资源。

这个时候如果方法 readLine 和自动关闭资源的过程都抛出异常,那么:

  • 函数执行结束之后抛出的是try块的异常,而try-with-resources语句关闭过程中的异常会被抑制,放在try块抛出的异常的一个数组里。(上面的非try-with-resources例子抛出的是finally的异常,而且try块的异常也不会放在fianlly抛出的异常的抑制数组里)
  • 可以通过异常的public final synchronized Throwable[] getSuppressed() 方法获得一个被抑制异常的数组。
  • try块抛出的异常调用getSuppressed()方法获得一个被它抑制的异常的数组,其中就有关闭资源的过程产生的异常。

try-with-resources 语句能放多个资源,使用 ; 分割

try (
        BufferedReader br = new BufferedReader(new FileReader(path));
        ZipFile zipFile = new ZipFile("");
        FileReader fileReader = new FileReader("");
) {
}

最后任务执行完毕或者出现异常中断之后是根据new的反向顺序调用各资源的close()的。后new的先关。

try-with-resources 语句也可以有 catch 和 finally 块

public void clean3(String path, Consumer<String> consumer){
    try (BufferedReader br = new BufferedReader(new FileReader(path))) {
        System.out.println("RuntimeException 前");
        int a = 1/0;
        System.out.println("RuntimeException 后");
    }catch (RuntimeException e){
        System.out.println("抛出 RuntimeException");
    }catch (IOException e){
        System.out.println("抛出 RuntimeException");
    }finally {
        System.out.println("finally");
    }
}

RuntimeException 前
抛出 RuntimeException
finally 

以上就是try-cache-finally读取文件错误try-with-resources使用方法的详细内容,更多关于try-with-resources读取文件的资料请关注脚本之家其它相关文章!

相关文章

  • Java的Spring框架中DAO数据访问对象的使用示例

    Java的Spring框架中DAO数据访问对象的使用示例

    这篇文章主要介绍了Java的Spring框架中DAO数据访问对象的使用示例,分为在Spring中DOA与JDBC以及与Hibernate的配合使用两种情况来进行演示,需要的朋友可以参考下
    2016-03-03
  • SpringBoot集成ip2region实现ip白名单的代码示例

    SpringBoot集成ip2region实现ip白名单的代码示例

    ip2region v2.0 - 是一个离线IP地址定位库和IP定位数据管理框架,10微秒级别的查询效率,提供了众多主流编程语言的 xdb 数据生成和查询客户端实现,本文介绍了SpringBoot集成ip2region实现ip白名单的代码工程,需要的朋友可以参考下
    2024-08-08
  • 多模块项目使用枚举配置spring-cache缓存方案详解

    多模块项目使用枚举配置spring-cache缓存方案详解

    这篇文章主要为大家介绍了多模块项目使用枚举配置spring-cache缓存的方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Jedis零基础入门及操作Redis中的数据结构详解

    Jedis零基础入门及操作Redis中的数据结构详解

    Jedis 的 API 方法跟 Redis 的命令基本上完全一致,熟悉 Redis 的操作命令,自然就很容易使用 Jedis,因此官方也推荐 Java 使用 Jedis 来连接和操作 Redis
    2022-09-09
  • SpringBoot整合Thymeleaf小项目及详细流程

    SpringBoot整合Thymeleaf小项目及详细流程

    这篇文章主要介绍了SpringBoot整合Thymeleaf小项目,本项目使用SpringBoot开发,jdbc5.1.48,主要涉及到Mybatis的使用,Thymeleaf的使用,用户密码加密,验证码的设计,图片的文件上传(本文件上传到本地,没有传到数据库)登录过滤,需要的朋友可以参考下
    2022-03-03
  • Springboot自定义mvc组件如何实现

    Springboot自定义mvc组件如何实现

    这篇文章主要介绍了Springboot自定义mvc组件如何实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • java图片缩放实现图片填充整个屏幕

    java图片缩放实现图片填充整个屏幕

    这篇文章主要介绍了java图片缩放实现图片填充整个屏幕,本文提供了两种解决方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • spring-boot react如何一步一步实现增删改查

    spring-boot react如何一步一步实现增删改查

    这篇文章主要介绍了spring-boot react如何一步一步实现增删改查,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Java 字符串转float运算 float转字符串的方法

    Java 字符串转float运算 float转字符串的方法

    今天小编就为大家分享一篇Java 字符串转float运算 float转字符串的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • java通过MySQL驱动拦截器实现执行sql耗时计算

    java通过MySQL驱动拦截器实现执行sql耗时计算

    本文主要介绍了java通过MySQL驱动拦截器实现执行sql耗时计算,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03

最新评论