前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >解决多个io流需要关闭而重复嵌套try-catch-finally的问题

解决多个io流需要关闭而重复嵌套try-catch-finally的问题

作者头像
砖业洋__
发布于 2023-05-06 11:02:04
发布于 2023-05-06 11:02:04
54800
代码可运行
举报
文章被收录于专栏:博客迁移同步博客迁移同步
运行总次数:0
代码可运行

问题如图:

相信大多数人都见过如此状态,流多了需要层层关闭,需要层层加上try-catch,为保证下一个流能关闭又要加上finally,烦人!!

我们先来一个测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Test {
    public static void main(String[] args) {
        try {
            System.out.println("第一try");
            throw new Exception("异常");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("finally");
            try {
                throw new Exception("又是异常");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("会执行吗");
        }
    }
}

运行结果:

提取出重要信息,finally里面可以抓到异常后可以继续往下执行,也就是说finally里面try-catch抓到异常后也必须把这个代码块执行完。

那么有人就写了一个工具类,这种工具类对吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class IOUtil {
    public static void close(Closeable... closeableList) {
        try {
            for (Closeable closeable : closeableList) {
                if (closeable != null){
                    closeable.close();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

然后

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
finally{
      IOUtil.close(is, os);
}

看似正确,实则错误!!

如果第一个流关闭的时候异常,那么第二个流close()就不可达,执行不到

这和并列写没区别,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
finally{
    try{
          is.close();
          os.close();   // 第一个流关闭出异常第二个流关闭就不可达,执行不到,等于没关
    } catch(Exception e) {
    }
}

那怎么办呢?不能写工具类吗?

不是不能写,而是这种写法是错误的,这种情况下应该把try-catch放在for循环里面,这样才能保证循环会依次关闭流

正确写法1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void close(Closeable... closeableList) {
    for (Closeable closeable : closeableList) {
        try {
            if (closeable != null) {
                closeable.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

然后

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
finally{
      IOUtil.close(is, os);
}

正确解法2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public <T extends java.io.Closeable> void close(T t) {
    try {
        if (t != null) {
            t.close();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

然后

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
finally {
    close(in);
    close(raf);
    close(br);
}

哪怕其中有流关闭出了异常,也不会影响到其他流的关闭,finally{...}里面的东西是要执行完的

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-08-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
你还在使用 try-catch-finally 关闭资源?
作者:何甜甜在吗 链接:https://juejin.im/post/5b8f9fa05188255c6f1df755
Java技术栈
2020/07/03
8830
Java常用工具类之IO流工具类
package com.wazn.learn.util; import java.io.Closeable; import java.io.IOException; /** * IO流工具类 * * @author yangzhenyu * */ public class IOUtil { /** * 关闭一个或多个流对象 * * @param closeables * 可关闭的流对象列表 * @thro
二十三年蝉
2018/02/28
8650
IO流简要介绍
一、什么是IO流? 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流。流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。IO流的分类:根据处理数据类型的不同分为:字符流和字节流;根据数据流向不同分为:输入流和输出流。 IO流基类 InputStream 输入流基类 read OutputStream 输出流基类 write 1.IO流分类 1.1流向分类: 输入输出 1.2文件操作处
2020/10/23
3280
你是否还在写try-catch-finally?来使用try-with-resources优雅地关闭流吧
开发中,我们常常需要在最后进行一些资源的关闭。比如读写文件流等,常见的,我们会在最后的finally里进行资源的关闭。但是这种写法是很不简洁的。其实,早在JDK1.7就已经引入了try-with-resources来关闭资源的方式,我们今天就来体验一下try-with-resources的简洁之处。
Happyjava
2019/07/16
1.4K0
你是否还在写try-catch-finally?来使用try-with-resources优雅地关闭流吧
与面试官聊try-catch-finally关闭资源,你的答案还是10年前的?
有编程经验的朋友都知道,在程序运行中如果打开了一些资源,那么当发生异常或程序结束时都需要进行资源的关闭,不然会造成内存溢出的问题。
程序新视界
2021/12/07
6960
我去,你竟然还在用 try–catch-finally
这是读者 Alice 上周特意给我发来的信息,真令我动容。的确,上次的“我去”阅读量杠杠的,几个大号都转载了,包括 CSDN,次条当天都 1.5 万阅读。但比如“还以为你有什么新特技,没想到用的是 Java 13”这类批评的声音也不在少数。
沉默王二
2020/04/07
1.3K0
我去,你竟然还在用 try–catch-finally
第5次文章:关于IO流的基本操作
春节假期就要结束啦,很多小伙伴儿明天就开始上班了,祝各位小伙伴儿新的一年工作顺心,万事顺利哟!
鹏-程-万-里
2019/09/27
3570
认知IO流之 — FileDescriptor
FileDescriptor 顾名思义是文件描述符,FileDescriptor 可以被用来表示开放文件、开放套接字等。比如用 FileDescriptor 表示文件来说: 当 FileDescriptor 表示文件时,我们可以通俗的将 FileDescriptor 看成是该文件。但是,我们不能直接通过 FileDescriptor 对该文件进行操作。
cxuan
2019/09/25
5.6K0
认知IO流之 — FileDescriptor
Java基础19(01)总结IO流,异常try…catch,throws,File类
1:异常(理解) (1)程序出现的不正常的情况。 (2)异常的体系 Throwable |--Error 严重问题,我们不处理。 |--Exception |--RuntimeException 运行期异常,我们需要修正代码 |--非RuntimeException 编译期异常,必须处理的,否则程序编译不通过 package cn.itcast_01; /* * 异常:程序出现了不正常的情况。 * * 举例:今天天气很好,班长出去旅游。骑着自行车,去山里面呼吸新鲜空气。 * 问题1
Java帮帮
2018/03/16
9210
IO 流最全讲解
流 : 流动 、流向 从一端移动到另一端(源头与目的地) 程序 与 文件|数组|网络连接|数据库,以程序为中心
帅飞
2019/01/22
5210
try 语句如何更优雅的关闭资源?请看这里!
try-with-resources是 JDK 7 中引入的一个新的异常处理机制,它能让开发人员不用显式的释放try-catch语句块中使用的资源。
Java极客技术
2022/12/04
4100
try-catch-finally中的4个大坑,不小心就栽进去了!
在 Java 语言中 try-catch-finally 看似简单,一副人畜无害的样子,但想要真正的“掌控”它,却并不是一件容易的事。别的不说,咱就拿 fianlly 来说吧,别看它的功能单一,但使用起来却“暗藏杀机”,若您不信,咱来看下面的这几个例子...
磊哥
2021/02/02
1K0
教妹学 Java 第 42 讲:try-catch-finally
“该讲 try-catch-finally 了。”我说,“try 关键字后面会跟一个大括号 {},我们把一些可能发生异常的代码放到大括号里;try 块后面一般会跟 catch 块,用来处理发生异常的情况;当然了,异常不一定会发生,为了保证发不发生异常都能执行一些代码,就会跟一个 finally 块。”
沉默王二
2021/07/16
4230
Java文件IO流的操作总结
Java中的IO操作涉及到的概念及相关类很多,很容易弄混,今天特来整理总结一下,并附上一份完整的文件操作的代码。
翎野君
2023/05/12
3300
Java文件IO流的操作总结
JDK9新特性实战:简化流关闭新姿势。
做Java开发的都知道,每个资源的打开都需要对应的关闭操作,不然就会使资源一直占用而造成资源浪费,从而降低系统性能。 关于资源的关闭操作,从JDK7-JDK9有了不少的提升及简化。 JDK6 在JDK6及之前,每个资源都需要我们手动写代码关闭,如: FileInputStream fis = null; byte[] buffer = new byte[1024]; try { fis = new FileInputStream(new File("E:\\Java技术栈.txt"));
Java技术栈
2018/04/02
7770
JDK9新特性实战:简化流关闭新姿势。
Java——try catch finally异常的捕获及处理逻辑实例详解大全
异常指的是导致程序中断执行的一种指令流。一旦发生异常且没有正常处理的话,程序将中断执行。
Winter_world
2020/09/25
5.5K0
Java——try catch finally异常的捕获及处理逻辑实例详解大全
JavaSE(十二)之IO流的字节流(一)
前面我们学习的了多线程,今天开始要学习IO流了,java中IO流的知识非常重要。但是其实并不难,因为他们都有固定的套路。 一、流的概念       流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以"流"的方式进行。设备可以是文件,网络,内存等       流具有方向性,至于是输入流还是输出流则是一个相对的概念,一般以程序为参考,如果数据的流向是程序至设备,我们成为输出流,如果数据的流向是设备至程序称为输入流。       数据以二进制的形式在程序与设备之间流动传输,就
用户1195962
2018/01/18
9410
JavaSE(十二)之IO流的字节流(一)
Java基础知识梳理 ——— IO流
利用 Java IO 你可以访问文件与目录,以及如何以文本格式和二进制格式来读写数据。
求和小熊猫
2020/11/25
5270
Java之IO流
​ ③ File 类中涉及关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,并涉及到写入的读取文件内容的操作。如果需要读取或写入的 ”终点“。
OY
2022/03/12
4780
Java之IO流
Java IO流
# Java IO流 # 文件 # 什么是文件 # 文件流 # 常用的文件操作 # 创建文件对象相关构造器和方法 代码演示: package com.file; import org.junit.jupiter.api.Test; import java.io.File; import java.io.IOException; //演示创建文件 public class FileCreate { public static void main(String[] args) {
用户9615083
2022/12/25
1.2K0
Java IO流
相关推荐
你还在使用 try-catch-finally 关闭资源?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验