A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© funneies 中级黑马   /  2013-8-21 13:18  /  2066 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


IO异常处理,如果在finally处理bufos.close()和在try块里处理bufos.close()有什么区别呢?
  1. public static void copy_1(){
  2.                 BufferedInputStream bufis = null;
  3.                 BufferedOutputStream bufos = null;
  4.                 try {
  5.                         bufis = new BufferedInputStream(new FileInputStream("D:\\test\\1.mp3"));
  6.                         bufos = new BufferedOutputStream(new FileOutputStream("D:\\test\\11.mp3"));
  7.                         int by = 0;
  8.                         while((by=bufis.read())!=-1){
  9.                                 bufos.write(by);
  10.                         }
  11.                 } catch (FileNotFoundException e) {
  12.                         e.printStackTrace();
  13.                 } catch (IOException e) {
  14.                         e.printStackTrace();
  15.                 } finally{
  16.                         try {
  17.                                 if(bufos!=null)
  18.                                         bufos.close();
  19.                         } catch (IOException e) {
  20.                                 e.printStackTrace();
  21.                         }
  22.                         try {
  23.                                 if(bufis!=null)
  24.                                         bufis.close();
  25.                         } catch (IOException e) {
  26.                                         e.printStackTrace();
  27.                                 }
  28.                 }
  29.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

3 个回复

倒序浏览
首先你要明白java的异常处理机制.
1.如果在try语句块的第1行抛出了一个异常,那么程序是不会往下继续执行,而是跳转到catch语句块(假如这个异常是被catch声明可以捕获的)

结合你的实际情况
假如把.close()写在try语句块中,那么只要这一行前面的任意一行抛出了一个异常,.close()这一行就不会被执行到了.
而写在finally中,无论如何都会被执行到(当然 如果你要关2个流的话 需要对每个流的.close()进行单独的try catch).

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

回复 使用道具 举报
finally是无论发不发生异常都会执行到,try里的语句,只要有一句异常,都不会再往下执行,会跳转到catch里面
回复 使用道具 举报
为了报复系统资源能够被释放,java提供了finally方法,即使是出现了异常 finally中的代码也会执行的
如果在try块中执行close方法,但是在close方法执行之前跑出了异常 ,这个close方法是不会执行的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马