黑马程序员技术交流社区

标题: 流关闭出现异常求解 [打印本页]

作者: 王鹏伟    时间: 2013-2-25 21:37
标题: 流关闭出现异常求解
  1. public class Demo8 {         
  2.      public static void main(String[] args) throws IOException {   
  3.          for (int i = 0; i < 10; i++) {
  4.              BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  5.              String readLine = br.readLine();
  6.              System.out.println(readLine);
  7.              br.close();
  8.           }   
  9.       }
  10. }
复制代码
为什么循环一次后会发生Stream closed 流已关闭的异常?


作者: 罗海云    时间: 2013-2-25 21:58
本帖最后由 罗海云 于 2013-2-25 22:07 编辑

package com.itheima.day01;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.lang.*;

class test
{
        public static void main(String[] args) throws Exception
        {
          BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
          for (int i = 0; i < 10; i++) {

                 String readLine = br.readLine();
                 System.out.println(readLine);
                 
          }
          br.close();
        }
}
这样就行了.

作者: 黄杨    时间: 2013-2-25 22:29
你这样做目的何在?一般都是用while循环来判断缓冲区里面有没有东西然后进行操作,像这样用for来做有什么特别的好处?
作者: 陈科宇    时间: 2013-2-25 22:42
朋友,你这样写的程序太那啥了。怎么可以循环地创建那么多的对象。
作者: 陈科宇    时间: 2013-2-25 23:53
public class Demo8 {         
    public static void main(String[] args) throws IOException {
        for (int i = 0; i < 10; i++) {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String readLine = br.readLine();
            System.out.println(readLine);
            /*
             * 朋友,首先得说,程序这样说,实在是不能被接收的。重复创建了太多的BufferedReader对象,
             * 大大增加了不必要的内存开销。你循环一次后出现Stream Closed是因为你的键盘输入流已经关闭,
             * 只有下次启动程序时才能打开。程序的优化楼上忧伤写出了,你好好看看。而且应该处理异常,你也
             * 没有做,视频里有例子,好好参照一下。
             */
            br.close();
         }   
     }
}
作者: 陈科宇    时间: 2013-2-25 23:55
  1. public class Demo8 {         
  2.     public static void main(String[] args) throws IOException {
  3.             BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  4.             String readLine = br.readLine();
  5.             System.out.println(readLine);
  6.             br.close();
  7.             BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
  8.             String readLine1 = br.readLine();
  9.             System.out.println(readLine1);
  10.             br1.close();
  11.            /*
  12.             * 看了这个例子你就会更明白了。这会报一样的错误。
  13.             */
  14.     }
  15. }
复制代码

作者: Benwolf0818    时间: 2013-2-26 11:25
public class Demo8 {         
     public static void main(String[] args) throws IOException {   
         for (int i = 0; i < 10; i++) {
             BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
             String readLine = br.readLine();
             System.out.println(readLine);
          }   
             br.close();
      }
}
作者: 何伟    时间: 2013-2-26 14:47
public class Demo8 {         
     public static void main(String[] args) throws IOException {   
         for (int i = 0; i < 10; i++) {
             BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
             String readLine = br.readLine();
             System.out.println(readLine);
            // br.close();//在这里br都关闭了孩子们循环啊吧
          }   
             br.close(); //循环完在关就可以了
      }
}


作者: 赵家阳    时间: 2013-2-26 18:38
  1. import java.io.*;
  2. public class Demo8 {         
  3.     public static void main(String[] args) throws IOException
  4.         {   
  5.                  BufferedReader br = null;
  6.                  try{
  7.                          br = new BufferedReader(new InputStreamReader(System.in));
  8.                          String line = null;
  9.                          while((line=br.readLine())!=null)
  10.                          {
  11.                                 if("over".equals(line))        //如果输入over,就结束。
  12.                                         break;
  13.                                 System.out.println(line.toUpperCase());
  14.                          }
  15.                  }
  16.                  catch(IOException e)
  17.                  {
  18.                          System.out.println(e.toString());
  19.                  }
  20.                  finally{        //必定会运行,一定会结束。
  21.                          br.close();                         
  22.                  }       
  23.     }
  24. }
复制代码
首先,你这样的写法却是很有“新意”,在循环里面,你每一次都new了一个BufferedReader对象,但是循环结束时已经关闭了,而且下次循环时又new了一个新的BufferedReader对象,如果这么理解的话,应该是没有错的。但出异常了,这个我也回答不了。但是我不推荐你这样写,原因如下:

   1,把BufferedReader放到循环里面,这样你要创建多少对象?这是很浪费资源的。即便你每一次都关闭了,这也有点不划算。将BufferedReader放到循环外面,即省资源,又达到目的,一举两得。那么此时也必须把close()放到循环外面。
  2,其次,不应该用for循环。for循环在此处不能判断程序到什么时候结束(固定的次数有些不便),不易控制循环。如果要实现结束的话,还要在循环里面继续添加代码,会降低效率。但是,readLine();对于直接从键盘录入的话,不能直接靠默认的结束符来结束来结束循环。所以还要考自定义结束符(见上)来实现结束。






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