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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© sbeeqnui1987 中级黑马   /  2012-6-15 00:33  /  2163 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 sbeeqnui1987 于 2012-6-19 21:41 编辑

InputStream in = null;
try {
    in = new FileInputStream("t.txt");
    // ...............IO操作
} finally { //**********
    if(in != null){
        try {
       in.close();
        }catch(IOException e) {
           //.....
        }finally {
in = null;  //疑惑处
        }
     }
}
各位觉得最后出异常时把in = null有意义么?
如果有意义的话,那我们直接在//**********
就把in=null就可以了,何必再in.close()来捕获异常再in=null?
或者说in=null有没有把系统资源给回收起来?
最后再问一下in.close()出异常的时候,虚拟机把系统资源回收起来了没?
大家一起说说自己的看法吧

3 个回复

倒序浏览
如果 in == null,就说明 in这个引用所指向的对象还没有被创建,自然 in.close()也就不可能被执行,而且会报异常。我是这样想的,程序中 如果你先声明变量
InputStream(或者其他流类型) in = null;
然后执行其他语句,再 in = new 、、、、
在in new之前其他语句出exception,这时流没有被打开,也就无需关闭,如果不判断if(null != in) 硬要关闭in就出exception

另外你的代码按如下写会更合理:

if(null != in){
      try{
           in.flush();
           in.close();
           in = null;
      }
      catch(IOExection e){};
}
回复 使用道具 举报
如果:InputStream in = null;的声明是在方法的里面,而且,在finally后面没有什么代码的话,finally中的in = null可以不需要

如果finally后面还有很多的代码的话,此处使用in = null可以告诉JVM,new FileInputStream("t.txt");实例化后的对象可以被回收了,而没有这个语句的话,则只有在InputStream in的作用域结束后才可能被JVM回收
回复 使用道具 举报
说明两点:
1.in.close();是关闭流的,如果你直接将in=null,那么流并没有关闭,还是存在的。
2.java给开发者提供了一个承诺,就是垃圾自动回收,但是回收的前提是“垃圾”,何为垃圾:就是没有引用指向的对象。因此,将设置in=null;使得垃圾回收机制能够及早建此资源回收。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马