大哥,System.in这个流不能被关闭。这个是个例外。你上网找找看有谁使用System.in时关闭了的?

解决方案 »

  1.   

    浪费空间,弄成成员变量,while外面关闭流管道
      

  2.   

    说System.in被关了,都是错的。根本没看到楼主关闭System.in,只是关闭了br而已。关闭br,里面的System.in是不会被关闭的。都知道,java的io用了典型的decoration设计模式,流可以嵌套。比如你的BR就嵌套了两个流在里面。所有的流必须显式关闭,jvm是不会给你自动关闭的。所以,br关闭了,里面的System.in是不会被关的,除非你显式的System.in.close(); 这样才是你们说的原因。简单测试:
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("第一个BR,请输入测试数据:");
    String str = br.readLine();
    System.out.println(str);System.out.println("第二个BR,请输入测试数据:");
    BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
    str = br1.readLine();
    System.out.println(str);
    br1.close();以上代码定义了两个br,每个br用完立即关闭。按照楼上有人说的,第二个br岂不有问题?
    但运行过的人会知道,每个br都可以正常运行。
    综述,lz的问题不在于System.in这个流被关了,而是你频繁的创建BR,而关闭只做了一次(就是你最后创建的那个br)。如果你一次while后立即关闭这个br,问题就不存在了
      

  3.   

    上面还是重复了,请将对br的复制移动到br定义处,再试。
      

  4.   

    to :12楼,while里面怎么没关闭当前的br?这样当然是要失败的。我前面的帖子说的很清楚,每轮while里面,对每个br都关闭一次。而且是在br新创建之前。
      

  5.   


    同意此楼的差点,每一次while中,br都应该关闭一次,你再加行关闭代码 试试
      

  6.   

    还是晕 在while中每次关闭br不可以吗 看上面的讨论 while中在br创建一支关闭就会报错?
      

  7.   

    的确是的,表面看不像有什么错误,每次循环都是给br新赋值,之前旧的关闭应该没什么错,内部貌似是涉及到了BufferedInputStream的buf数组为空导致protected volatile byte buf[];至于为什么为空还要细查
      

  8.   

    System.in是系统级的流,不需要你来关闭,至于br则是可以人为控制的,不在循环关闭肯定不行,应为你新开啦br的对象但原来的br对象没被关闭肯定会报异常的.(就好比,本来别人只有1元钱,你借走啦,但后来还想去借,由于你没还,肯定是不会在有借的,而那个人肯定会告诉你,这是不行的<异常>)
      

  9.   

    现在凭直觉是 与System.in串联的流内部数据结构只初始化了一次,关闭后貌似不再初始化了,因此空指针,但没找到它是哪里初始化的
      

  10.   

    br.close();这行代码要移到循环之外去。否则第一次循环后流就已经被关闭了。
      

  11.   

    表面上看下一次循环是新赋的对象
    br = new BufferedReader(new InputStreamReader(System.in));
      

  12.   

    上面的怀疑貌似又不成立
    因为即使关闭System.in流,问题依旧try {
        System.in.close();
        br.close();
    } catch(Exception e) {
        e.printStackTrace();
    }纳闷引用已经指向新的对象了,之前的操作居然还会对其产生影响,这个BufferedInputStream很奇怪又不见有初始化内部属性buf[]的过程
      

  13.   

    看来直觉是对的,br.close效果已经包含了System.in.close(); 流的close无法改变只初始化一次的本质,因为System.in是final的    /**
         * The "standard" input stream. This stream is already
         * open and ready to supply input data. Typically this stream
         * corresponds to keyboard input or another input source specified by
         * the host environment or user.
         */
        public final static InputStream in = nullInputStream();
      

  14.   


    您觉得怎样才是在while里面关闭br哦,貌似那个finally {
    try {
    br.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }都在while里面吧!
      

  15.   


    你的代码里只有一次close啊,哪有每次都关闭br
    如果br关闭了,里面的流会随之关闭的,看一下close方法的实现就清楚了。
    system.in没必要每次关闭。
      

  16.   

    根据我的实验,br关闭了,其内部引用的所有流也会关闭。你给出的代码第一个br并没有关闭,所以你能够执行成功!BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("第一个BR,请输入测试数据:");
    String str = br.readLine();
    System.out.println(str);
    br.close();System.out.println("第二个BR,请输入测试数据:");
    BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
    str = br1.readLine();
    System.out.println(str);
    br1.close();运行如上代码,到br1的时候则会抛出Stream Closed的异常。