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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王鹏伟 中级黑马   /  2013-2-25 21:37  /  1718 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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 流已关闭的异常?

8 个回复

倒序浏览
本帖最后由 罗海云 于 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();
        }
}
这样就行了.

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9

查看全部评分

回复 使用道具 举报
你这样做目的何在?一般都是用while循环来判断缓冲区里面有没有东西然后进行操作,像这样用for来做有什么特别的好处?
回复 使用道具 举报
朋友,你这样写的程序太那啥了。怎么可以循环地创建那么多的对象。
回复 使用道具 举报
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();
         }   
     }
}

评分

参与人数 1黑马币 +12 收起 理由
Rancho_Gump + 12 赞一个!

查看全部评分

回复 使用道具 举报
  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. }
复制代码
回复 使用道具 举报
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();
      }
}

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9

查看全部评分

回复 使用道具 举报
何伟 中级黑马 2013-2-26 14:47:57
8#
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(); //循环完在关就可以了
      }
}

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9

查看全部评分

回复 使用道具 举报
  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();对于直接从键盘录入的话,不能直接靠默认的结束符来结束来结束循环。所以还要考自定义结束符(见上)来实现结束。

评分

参与人数 1黑马币 +12 收起 理由
Rancho_Gump + 12 赞一个!

查看全部评分

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