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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曾浩 中级黑马   /  2012-10-17 14:58  /  1546 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 曾浩 于 2012-10-17 15:11 编辑

public class TestFileReader {
public static void main(String[] args) {
  
  FileReader read = null;
  try{
   read = new FileReader("Hell.txt");
   readShu(read);
      int ch = 0;
   try {
    while((ch=read.read())!= -1){
         System.out.println("ch="+(char)ch);
    }
   } catch (IOException e) {
      e.printStackTrace();
   }
  }catch(FileNotFoundException e){
  System.out.println(e);}
  finally{
   try {
    if(read!=null)
    read.close();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
}
public static void readShu(FileReader read){
char [] ch = new char[3];
int num = 0;
try {     
  while((num=read.read(ch))!=-1){     
      System.out.println("num="+num+"-----"+new String(ch,0,num));
       }
  
} catch (IOException e) {
   e.printStackTrace();
}finally{
  try {
   if(read!=null)
   { System.out.println("guan");
   read.close();}
  } catch (IOException e) {
      e.printStackTrace();
  }
}
}
}
为什么执行这个程序会出异常   当我不关闭 流时 程序不会有异常 只是没有往下执行了 当我关闭流时 程序就出现了异常
难道是应为调用了 readShu()方法 读取数据的指针已经读到数据的末尾了吗  如果是的话我关闭流为什么那个读取数据的指针为什么不复位呢?


评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

5 个回复

倒序浏览

try {
   if(read!=null)
    System.out.println("guan"); //当读到这里时,if语句就结束了。
   read.close(); //流关闭了
  } catch (IOException e) {
      e.printStackTrace();
  }
}

你调用的函数里。已经把流关闭了,关联的对象释放。
可是后面你还在关闭流。。明显异常了
回复 使用道具 举报
陈军 发表于 2012-10-17 15:07
try {
   if(read!=null)
    System.out.println("guan"); //当读到这里时,if语句就结束了。

不好意思那可能是我发帖子时 误删了  但是加上了那个大括号还是有异常
回复 使用道具 举报
本帖最后由 陈军 于 2012-10-17 15:39 编辑
曾浩 发表于 2012-10-17 15:10
不好意思那可能是我发帖子时 误删了  但是加上了那个大括号还是有异常


不是大括号问题。而是你关流的问题。 外部要关闭。函数内部就不该执行close()
就算你把大括号加上,因为传进了对象。read不为Null了。所以也会在函数内部执行close()。read对象也就释放了

可是你调用之后还在执行 读和关闭动作,所以就异常了
回复 使用道具 举报
本帖最后由 王威 于 2012-10-17 15:37 编辑

很显然是你先调用了readShu()方法后把流关闭了,你再读当然会抛异常啊。
假如你在readShu()方法中不关闭流,那么当这个方法执行完后,读取数据的指针已经指到了末尾,你再继续用这个流继续读取当然没有数据可读的了。但是如果你在readShu()方法中关闭流,就算数据指针会复位,可是你接下来读取文件的流依然是你关闭的同一个流,当然会跑异常了。
回复 使用道具 举报
public class TestFileReader {
   
   
    public static void main(String[] args) {
  
        FileReader read = null;
        try{
            read = new FileReader("Hell.txt");
            readShu(read);//1.  这里的read不是空,已经实例化了
            int ch = 0;
            try {
                 while((ch=read.read())!= -1)//这里的read,是从readShu那里“过滤过的”,如果在readShu()函数中关了流(即执行了read.close()),
                                                            //那么这里以及下面就别再操作它了,它已经是null了,不再指向任何对象了

                 {
                    System.out.println("ch="+(char)ch);
                 }
              } catch (IOException e) {
                e.printStackTrace();
              }
        }catch(FileNotFoundException e){
             System.out.println(e);
        }finally{
             try {
                if(read!=null)
                    read.close();
             }catch (IOException e) {
                e.printStackTrace();
             }
        }
    }



    public static void readShu(FileReader read){
        char [] ch = new char[3];
        int num = 0;
        try {   
            while((num=read.read(ch))!=-1)
            {   
                System.out.println("num="+num+"-----"+new String(ch,0,num));
            }
  
        } catch (IOException e) {
            e.printStackTrace();
        }finally{//这里的蓝色部分的代码可以不需要
            try {
               if(read!=null)
               {
                   System.out.println("guan");
                       read.close();
               }
            } catch (IOException e) {
              e.printStackTrace();
            }
        }
    }
}

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马