Java IO: 异常处理

转载自   Java IO: 异常处理

译文链接 作者:Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com)

流与Reader和Writer在结束使用的时候,需要正确地关闭它们。通过调用close()方法可以达到这一点。不过这需要一些思考。请看下边的代码:

InputStream input = new FileInputStream("c:\\data\\input-text.txt");
int data = input.read();
while(data != -1) {//do something with data...  doSomethingWithData(data);data = input.read();
}
input.close();

第一眼看这段代码时,可能觉得没什么问题。可是如果在调用doSomethingWithData()方法时出现了异常,会发生什么呢?没错,这个InputStream对象就不会被关闭。

为了避免异常造成流无法被关闭,我们可以把代码重写成这样:

InputStream input = null;
try{input = new FileInputStream("c:\\data\\input-text.txt");int data = input.read();while(data != -1) {//do something with data...doSomethingWithData(data);data = input.read();}
}catch(IOException e){//do something with e... log, perhaps rethrow etc.
} finally {if(input != null)input.close();
}

注意到这里把InputStream的关闭代码放到了finally块中,无论在try-catch块中发生了什么,finally内的代码始终会被执行,所以这个InputStream总是会被关闭。

但是如果close()方法抛出了异常,告诉你流已经被关闭过了呢?为了解决这个难题,你也需要把close()方法写在try-catch内部,就像这样:

} finally {try{if(input != null)input.close();} catch(IOException e){//do something, or ignore.}
}

这段解决了InputStream(或者OutputStream)流关闭的问题的代码,确实是有一些不优雅,尽管能够正确处理异常。如果你的代码中重复地遍布了这段丑陋的异常处理代码,这不是很好的一个解决方案。如果一个匆忙的家伙贪图方便忽略了异常处理呢?

此外,想象一下某个异常最先从doSomethingWithData方法内抛出。第一个catch会捕获到异常,然后在finally里程序会尝试关闭InputStream。但是如果还有异常从close()方法内抛出呢?这两个异常中得哪个异常应当往调用栈上传播呢?

幸运的是,有一个办法能够解决这个问题。这个解决方案称作“异常处理模板”。创建一个正确关闭流的模板,能够在代码中做到一次编写,重复使用,既优雅又简单。详情参见Java异常处理模板。

Java7中IO的异常处理

从Java7开始,一种新的被称作“try-with-resource”的异常处理机制被引入进来。这种机制旨在解决针对InputStream和OutputStream这类在使用完毕之后需要关闭的资源的异常处理。可以浏览Try with Resource in Java 7获得更多信息。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

钟 docker讲解

任意目录打开git bash AdministratorPC-201908221240 MINGW64 ~/Desktop/开发工具$ ssh root10.23.12.67 连接服务器 The authenticity of host 10.23.12.67 (10.23.12.67) cant be established. ECDSA key fingerprint is SHA256:q//66ce/mAHBGMTzqoOuHyW4h2m3ywE6BQevsNXv…

拦截器---SpringMVC(权限拦截)

拦截器 概述 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。 **过滤器与拦截器的区别:**拦截器是AOP思想的具体应用。 过滤器 servlet规范中的一部分,任…

搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接

我们知道rabbitmq是一个专业的MQ产品,而且它也是一个严格遵守AMQP协议的玩意,但是要想骚,一定需要拿出高可用的东西出来,这不本篇就跟大家说 一下cluster的概念,rabbitmq是erlang写的一个成品,所以知道如何…

Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace"houseDao" ><result…

JS Promise的实现原理

转载自 JS Promise的实现原理在前端开发过程中&#xff0c;会经常使用到 Promise 模式&#xff0c;可以使异步代码看起来如同步般清新易读&#xff0c;从而从回调地狱中解脱出来。ES6中 已原生支持 Promise&#xff0c;但在未支持的浏览器中还需要通过 polyfill 模拟实现。下…

php类常量的特点,php类常量是什么?类常量用法详解

这篇文章主要介绍了php类常量用法,实例分析了php中类常量的概念、特性与相关使用技巧,需要的朋友可以参考下本文实例讲述了php类常量用法。分享给大家供大家参考。具体如下&#xff1a;类常量属于类自身&#xff0c;不属于对象实例&#xff0c;不能通过对象实例访问子类可以重写…

手机钉钉在进行视频会议时怎么录屏

https://www.iefans.net/info/v1037168.html 钉钉在进行视频会议时怎么录屏 编辑&#xff1a;秩名2020-03-24 10:14:52 钉钉 类型&#xff1a;效率办公 语言&#xff1a;简体中文 安卓下载 扫一扫下载游戏 钉钉是一款很好用的学习办公软件&#xff0c;它的工呢很多&#xf…

文件上传与下载----SpringMVC

文件上传 1、导入文件上传的jar包&#xff0c;commons-fileupload &#xff0c; Maven会自动帮我们导入他的依赖包 commons-io包&#xff1b; <!--文件上传--> <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupl…

Vue3学习(后端开发)

目录 一、安装Node.js 二、创建Vue3工程 三、用VSCode打开 四、源代码目录src 五、入门案例——手写src 六、测试案例 七、ref和reactive的区别 一、安装Node.js 下载20.10.0 LTS版本 https://nodejs.org/en 使用node命令检验安装是否成功 node 二、创建Vue3工程 在…

微软Ignite大会约起来

今年的微软Ignite技术大会今天开始了&#xff0c;要好好学习哦&#xff0c;提供直播地址&#xff0c;通过阅读原文链接可以直达直播地址 http://soft.zdnet.com.cn/special/microsoft_ignite_2016。 大会亮点 创新 IT 技术飞速发展促发了更多行业创新&#xff0c;因此您和您的企…

aria2c rpc php,aria2c 的基本配置,附带傻瓜式源码

经常需要配置&#xff0c;但是 每次都需要查找配置项的意义&#xff0c;所以索性写在这里&#xff0c;以便有个记录&#xff0c;下次无需查找。aria2c -d/Users/blueboz/Downloads \-c \-D \-laria.log \-j5 -k1M \-x16 -s16 \--file-allocationnone \--enable-rpc \--load-coo…

探讨JS合并两个数组的方法

转载自 探讨JS合并两个数组的方法我们在项目过程中&#xff0c;有时候会遇到需要将两个数组合并成为一个的情况。 比如&#xff1a; var a [1,2,3]; var b [4,5,6];有两个数组a、b&#xff0c;需求是将两个数组合并成一个。方法如下&#xff1a; 1、concat js的Array对象提供…

最全Windows下搭建go语言开发环境以及开发IDE

https://www.cnblogs.com/ynhmonster/p/8335797.html GO语言开发环境的搭建---Windows环境下 1、Golang下载 我是通过Golang中国下载的&#xff0c;因为去官网下载十分慢&#xff0c;甚至没有进度条。 下载地址&#xff1a; https://www.golangtc.com/download 我选择的是go1…

Mybatis+mysql动态分页查询数据案例——Mybatis的配置文件(mybatis-config.xml)

<?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><typeAliases><!-- 动…

外媒:微信小程序顺应“APP中启动APP”的行业潮流

BI中文站 11月30日报道 上周&#xff0c;中国网络巨头腾讯的高级副总裁张小龙对外披露了一些照片&#xff0c;显示聊天工具微信开始整合“小程序”。这一功能可以让微信的用户在无需下载软件的基础上&#xff0c;使用各种互联网应用服务&#xff0c;极大扩展微信的功能。 据外媒…

SpringMVC(笔记)

MVC简介 普通的web项目每次都要进行手动的把jar包导进去&#xff0c;否则会报500&#xff0c;class not found [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VstjHhuz-1609824493673)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images…

php 去掉url中的index.php,php 去掉url中的index.php

php去掉url中的index.php的方法&#xff1a;首先打开相应的代码文件&#xff1b;然后将if代码块嵌套在server代码块中&#xff1b;最后重启nginx服务器即可。本文操作环境&#xff1a;nginx1.0.4系统、PHP7.1版&#xff0c;DELL G3电脑nginx服务器去掉url中的index.php将if代码…

在ASP.NET Core中使用百度在线编辑器UEditor

0x00 起因 最近需要一个在线编辑器&#xff0c;之前听人说过百度的UEditor不错&#xff0c;去官网下了一个。不过服务端只有ASP.NET版的&#xff0c;如果是为了能尽快使用&#xff0c;只要把ASP.NET版的服务端作为应用部署在IIS上就可以立即使用了。不过我的需求并不急&#xf…

php 编写线程教程,php 实现多线程

通过php的Socket方式实现php程序的多线程。php本身是不支持多线程的&#xff0c;那么如何在php中实现多线程呢&#xff1f;可以想一下&#xff0c;WEB服务器本身都是支持多线程的。每一个访问者&#xff0c;当访问WEB页面的时候&#xff0c;都将调用新的线程&#xff0c;通过这…

Vue的this

一、vue编译模块 &#xff08;1&#xff09;模块域中导出对象域 export default {data() {return {msg: };} }; A.function定义函数 I、模块导出对象的各关键字的属性值 如data的值 export default {props:[propA},data:function() {//经Vue转换&#xff0c;该函数属于Vu…