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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王红霞 中级黑马   /  2012-7-19 23:49  /  1403 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王红霞 于 2012-7-20 09:50 编辑

import java.io.*;
class FileCopy
{
   public static void main(String[] args)
   {
      FileCopyed();
   }
   public static  void FileCopyed()
  {
      FileReader fr=null;
      FileWriter fw=null;
      try
     {
         fr=new FileReader("Test3.java");
         fw=new FileWriter("file_copy.txt");
         char[] buffer=new char[1024];
         int length=0;        
         while((length=fr.read(buffer))!=-1)
        {
         fw.write(buffer,0,length);
          System.out.println(new String(buffer,0,length));
        }

      }
      catch(IOException e)
     {
          throw new RuntimeException(e);
      }
      finally
     {
          if(fr!=null)//两个程序的结果是一样的 。对fr、fw的判空有什么意义?既然下面的程序也可以成功运行,那是不是就是说不需要判空?
          {
            try
            {
             fr.close();
            }
            catch(IOException e)
           {
             throw new RuntimeException(e);
           }
         }
         if(fw!=null)
        {
            try
           {
             fw.close();
           }
           catch(IOException e)
           {
             throw new RuntimeException(e);
           }
        }
    }
  }
}

------------------------------------------------------------------------------------------------------
import java.io.*;
class FileCopy
{
  public static void main(String[] args)
   {
      FileCopyed();
   }
   public static  void FileCopyed()
  {
      FileReader fr=null;
      FileWriter fw=null;
      try
     {
         fr=new FileReader("Test3.java");
         fw=new FileWriter("file_copy.txt");
         char[] buffer=new char[1024];
         int length=0;        
         while((length=fr.read(buffer))!=-1)
        {
         fw.write(buffer,0,length);
          System.out.println(new String(buffer,0,length));
        }

      }
      catch(IOException e)
     {
          throw new RuntimeException(e);
      }
      finally
     {
          //没有判空
            try
            {
             fr.close();
            }
            catch(IOException e)
           {
             throw new RuntimeException(e);
           }
        //没有判空
            try
           {
             fw.close();
           }
           catch(IOException e)
           {
             throw new RuntimeException(e);
           }

    }
  }
}


评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

4 个回复

正序浏览
丁二跃 发表于 2012-7-20 00:17
判空是很有必要的。
如果构造输入流,或输出流时出现异常,并未构造成功,那么执行finally的时候,fr 和 fw ...

嗯确实确实 没考虑到fr为空的时候 考虑不到位……
回复 使用道具 举报
判空是很有必要的。
如果构造输入流,或输出流时出现异常,并未构造成功,那么执行finally的时候,fr 和 fw 就是null

如果不判断是否为空就 执行 close 方法 ,那当 fr fw 为空时,就会产生空指针异常,所以正确的方法是先判断是否为null  不为null 的情况下才关闭。

你下面程序能正常运行是因为 创建输入 输出 没有异常,fr fw 为不为空。
fr=new FileReader("Test3.java");------》 fr=new FileReader("");
试试还正常不了?

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1

查看全部评分

回复 使用道具 举报
如果Test3.java和file_copy.txt不存在,那么fr和fw就不存在,如果fr和fw不存在的话再调用close方法就会出现异常,所以必须判空
回复 使用道具 举报
mport java.io.*;
class FileCopy
{
   public static void main(String[] args)
   {
      FileCopyed();
   }
   public static  void FileCopyed()
  {
      FileReader fr=null;
      FileWriter fw=null;
      try
     {
         fr=new FileReader("Test3.java");
         fw=new FileWriter("file_copy.txt");
         char[] buffer=new char[1024];
         int length=0;        
         while((length=fr.read(buffer))!=-1)
        {
         fw.write(buffer,0,length);
          System.out.println(new String(buffer,0,length));
        }

      }
      catch(IOException e)
     {
          throw new RuntimeException(e);
      }
      finally
     {
          if(fr!=null)//两个程序的结果是一样的 。对fr、fw的判空有什么意义?既然下面的程序也可以成功运行,那是不是就是说不需要判空?
          {
            try
            {
             fr.close();
            }
            catch(IOException e)
           {
             throw new RuntimeException(e);
           }
         }
         if(fw!=null)
        {
            try
           {
             fw.close();
           }
           catch(IOException e)
           {
             throw new RuntimeException(e);
           }
        }
    }
  }
}
代码的规范和严谨性, 如果你的输出流和输入流都=null了,那你还关闭流,就会报异常 , 所以判断一下,如果不!=null的话,就关闭。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马