黑马程序员技术交流社区

标题: java中IO流关闭时的不解? [打印本页]

作者: sbeeqnui1987    时间: 2012-6-15 00:33
标题: java中IO流关闭时的不解?
本帖最后由 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()出异常的时候,虚拟机把系统资源回收起来了没?
大家一起说说自己的看法吧
作者: 刘笑    时间: 2012-6-15 09:57
如果 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){};
}
作者: 刘笑    时间: 2012-6-15 09:58
如果:InputStream in = null;的声明是在方法的里面,而且,在finally后面没有什么代码的话,finally中的in = null可以不需要

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





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2