解决多个io流需要关闭而重复嵌套try-catch-finally的问题
2020-01-11 15:17
204 查看
问题如图:
相信大多数人都见过如此状态,流多了需要层层关闭,需要层层加上try-catch,为保证下一个流能关闭又要加上finally,烦人!!
我们先来一个测试:
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抓到异常后也必须把这个代码块执行完。
那么有人就写了一个工具类,这种工具类对吗?
public class IOUtil { public static void close(Closeable... closeableList) { try { for (Closeable closeable : closeableList) { if (closeable != null){ closeable.close(); } } } catch (IOException e) { e.printStackTrace(); } } }
然后
finally{ IOUtil.close(is, os); }
看似正确,实则错误!!
如果第一个流关闭的时候异常,那么第二个流close()就不可达,执行不到
这和并列写没区别,如下:
finally{
try{
is.close();
os.close(); // 第一个流关闭出异常第二个流关闭就不可达,执行不到,等于没关
} catch(Exception e) {
}
}
那怎么办呢?不能写工具类吗?
不是不能写,而是这种写法是错误的,这种情况下应该把try-catch放在for循环里面,这样才能保证循环会依次关闭流
正确写法1:
public static void close(Closeable... closeableList) { for (Closeable closeable : closeableList) { try { if (closeable != null) { closeable.close(); } } catch (IOException e) { e.printStackTrace(); } } }
然后
finally{ IOUtil.close(is, os); }
正确解法2:
public <T extends java.io.Closeable> void close(T t) { try { if (t != null) { t.close(); } } catch (Exception e) { e.printStackTrace(); } }
然后
finally { close(in); close(raf); close(br); }
哪怕其中有流关闭出了异常,也不会影响到其他流的关闭,finally{...}里面的东西是要执行完的
=============================Talk is cheap, show me the code===========================
转载于:https://www.cnblogs.com/lcy0515/p/10807875.html
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 解决多个io流需要关闭而重复嵌套try-catch-finally的问题
- try- catch嵌套使用解决的问题
- 解决try catch finally中close的问题
- 逐行读txt文件(读写文件try catch finally 处理空行,编码格式,文件流释放问题,处理读到重复问题)
- "IE浏览器遇到问题需要关闭"的解决办法
- jsp防止重复登录问题以及关闭浏览器,意外断电等情况使用户退出的解决方法
- java中try{}catch{}和finally{}的执行顺序问题
- WORD遇到问题需要关闭解决办法
- 自己遇到的"Microsoft Management Console遇到问题需要关闭,我们对此引起的不便表示抱歉……"问题的解决方法
- try catch finally中return语句与非return语句的执行顺序问题
- try and catch and finally ------- stream 关闭
- try、catch、finally相关问题
- 关于JAVA的try catch finally的return返回值问题
- Microsoft Office Word 遇到问题需要关闭。我们对此引起的不便表示抱歉[解决方法]
- 关于Java中try catch finally throw return的执行顺序问题
- jsp防止重复登录问题以及关闭浏览器,意外断电等情况使用户退出的解决方法
- java try catch finally中的return问题
- 解决 Microsoft Office Word 遇到问题需要关闭。我们对此引起的不便表示抱歉
- 解决:K2.net Studio 遇到问题需要关闭
- Microsoft Office Word遇到问题需要关闭。怎么解决?