黑马程序员技术交流社区

标题: 关于关闭流的一个问题!求指点 [打印本页]

作者: 乔九    时间: 2013-2-24 14:46
标题: 关于关闭流的一个问题!求指点
package com.itcast;
import java.io.*;
public class IoDemo {
        public static void main(String[]args)throws IOException
        {
                FileWriter fw=null;
                try
                {
                         fw=new FileWriter("I:\\Demo.txt");
                        fw.write("jkdsfhgkja");
                }
                catch(IOException e)
                {
                        System.out.println(e.toString());
                }
                finally
                {
                        try
                        {
                                if(fw!=null)如果此处的fw为空了下面的关闭不就执行不到了吗?系统支援还是要被占用啊???这样写合适吗
                                        fw.close();
                                       
                        }
                        catch(IOException e)
                        {
                                System.out.println(e.toString());
                        }
                       
                }
        }

}
作者: 李挺    时间: 2013-2-24 14:59
如果fw==null,说明这一步fw=new FileWriter("I:\\Demo.txt");失败了,既然没有建立流对象,也就不用关资源了
作者: 游灿平    时间: 2013-2-24 15:02
  1. FileWriter fw = null;
  2.                 try {
  3.                         fw = new FileWriter("I:\\Demo.txt");
  4.                         fw.write("jkdsfhgkja");
  5.                 } catch (IOException e) {
  6.                         System.out.println(e.toString());
  7.                 } finally {
  8.                         //判断fw是为了避免空指针异常,fw没有指向就不需要关闭
  9.                         if (fw != null){
  10.                                 try {
  11.                                         fw.close();
  12.                                 } catch (IOException e) {
  13.                                         System.out.println(e.toString());
  14.                         }
  15.                                 fw = null; //最后加上这一步可以在关闭流后,fw置为空优化程序
  16.                    }
  17.                 }
  18.         }
复制代码

作者: 游灿平    时间: 2013-2-24 15:02
  1. FileWriter fw = null;
  2.                 try {
  3.                         fw = new FileWriter("I:\\Demo.txt");
  4.                         fw.write("jkdsfhgkja");
  5.                 } catch (IOException e) {
  6.                         System.out.println(e.toString());
  7.                 } finally {
  8.                         //判断fw是为了避免空指针异常,fw没有指向就不需要关闭
  9.                         if (fw != null){
  10.                                 try {
  11.                                         fw.close();
  12.                                 } catch (IOException e) {
  13.                                         System.out.println(e.toString());
  14.                         }
  15.                                 fw = null; //最后加上这一步可以在关闭流后,fw置为空优化程序
  16.                    }
  17.                 }
  18.         }
复制代码

作者: 曹春贵    时间: 2013-2-24 15:05
我也不是很清楚这个问题,也比较纠结,我自己的理解是:
  1. try
  2.                 {
  3.                          fw=new FileWriter("I:\\Demo.txt");
  4.                         fw.write("jkdsfhgkja");//程序运行到此处没有问题,如果是null自然会触发异常处理,即下面的异常输出
  5.                 }
  6.                 catch(IOException e)
  7.                 {
  8.                         System.out.println(e.toString());
  9.                 }
  10.                 finally
  11.                 {
  12.                         try
  13.                         {       //最后程序执行到这时,fw对象出现问题,变成null了(我不清楚会是什么情况变成null),null的对象执行fw.close()时肯定会报错的,这里加上异常处理,同时不为null的判断,增强容错性,此时fw为空也没必要close了
  14.                                 if(fw!=null)
  15.                                         fw.close();
  16.                                        
  17.                         }
  18.                         catch(IOException e)
  19.                         {
  20.                                 System.out.println(e.toString());
  21.                         }
  22.                         
  23.                 }
复制代码
以上只是我的个人理解,比较模糊,希望有高手解答这个问题{:soso_e192:}
作者: 胥文    时间: 2013-2-24 15:20
fially{}中的内容就是一定要执行的
而在里面加if判断有两个原因:
1,其中的判断如果是空就相当于流没创建,如果此时还要调用流的close(),就会报空指针异了;
2,当然了如果流都没有创建,那还有这个必要关流吗

作者: 王宝生    时间: 2013-2-24 20:35
二楼说的就挺好的了,如果fw为空了,那么只能是  fw=new FileWriter("I:\\Demo.txt");出错了。如果这一步出错了说明对象根本都没创建成,同时资源(文件)也没打开,所以谈不上资源泄露




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