转载自   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获得更多信息。

Java IO: 异常处理相关推荐

  1. java ioexception异常_12. Java IO: 异常处理

    想要查看此教程的目录请点击:Java IO教程目录贴地址 Streams或Readers/Writers在使用过程中需要是可关闭的.这需要调用close()方法.这需要一点儿思考,看下面的代码: In ...

  2. java io异常处理_IO流异常处理

    import java.io.File; import java.io.FileOutputStream; import java.io.IOException; /* *IO流异常处理 *try c ...

  3. Java IO: PipedInputStream

    PipedInputStream可以从管道中读取字节流数据,代码如下: 01 InputStream input = new PipedInputStream(pipedOutputStream); ...

  4. Java IO: RandomAccessFile

    转载自   Java IO: RandomAccessFile 译文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) RandomAccessFi ...

  5. Java IO: FileOutputStream

    转载自  Java IO: FileOutputStream 译文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) FileOutputStrea ...

  6. Java IO: FileInputStream

    转载自  Java IO: FileInputStream 译文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) FileInputStream可 ...

  7. Java IO: OutputStream

    转载自     Java IO: OutputStream 译文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) OutputStream类是Ja ...

  8. Java IO: InputStream

    转载自   Java IO: InputStream 译文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) InputStream类是Java I ...

  9. Java IO: PipedOutputStream

    转载自   Java IO: PipedOutputStream 译文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) PipedOutputSt ...

最新文章

  1. 利用Attribute和IErrorHandler处理WCF全局异常
  2. 2020年一季度中小微企业收入平均下降69.5%
  3. lambda表达式初步
  4. Python判断变量的数据类型的两种方法
  5. 线索二叉树的C语言实现
  6. 求矩阵中各列数字的和
  7. oracle 数据库启动停止小结
  8. GitHub使用流程、初学者的使用方法
  9. PAT甲级 1003 Dijkstra的口诀干货
  10. 在 Node.js 中设计一种 flexible 的模式(CQRS/ES/Onion) (译)
  11. 总数量超过五十个,史上最全的爬虫项目集合
  12. 在线出境游竞品分析报告:携程、途牛和马蜂窝
  13. meethigher-与骗子之间的对招
  14. 进程管理工具—— Sloth
  15. python自动化测试绕过手机验证码
  16. 百度搜索下拉框及百度相关搜索中刷关键字方法
  17. 有哪些值得推荐的计算机专业的竞赛?
  18. php 路径解析,ThinkPHP 5 结构与路径解析
  19. 详解sprintf()sprintf_s()
  20. 我的生活-上海周边玩乐

热门文章

  1. [Java基础]反射练习之越过泛型检查,运行配置文件制定内容
  2. [剑指offer]面试题22:栈的压入、弹出序列
  3. hdu1213 How Many Tables-并查集
  4. [蓝桥杯2018初赛]星期一-日期计算
  5. python3 beautifulsoup 表格,使用Python中的BeautifulSoup拉取特定的表数据
  6. css3是什么 ptml_CSS3
  7. 拦截器如何获取@requestbody_分布式系统中如何优雅地追踪日志(原理篇)
  8. word List 45
  9. python通过tkinter和json界面库实现考研知识点统计
  10. 动态规划 0-1背包问题 滚动数组