下面有两个函数,performAdd(), getDigFromConsole();
              第一次调用getDigFromConsole()可以得到正确结果;
             第二次调用getDigFromConsole()报错,错误详细信息如下:
            "java.io.IOException: Stream closed
at java.io.BufferedInputStream.getBufIfOpen(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at com.easyjava.sample.AddMachine.getDigFromConsole(AddMachine.java:50)
at com.easyjava.sample.AddMachine.performAdd(AddMachine.java:18)
at com.easyjava.sample.AppMain.main(AppMain.java:13)"         我的疑惑是
              1 stdin, bufin每次调用都会产生新实例,为什么会产生"Stream closed"的错误?
              2 finally块在while循环中,每次都会执行么
              3 str = bufin.readLine();会一直等待输入么?还是没有用户输入就会跳转到finally块执行。
              谢谢:-----------------------------------------------------------------------------------------------------------
        public int performAdd() {
int firstNum = getDigFromConsole();
int secondNum = getDigFromConsole();
return firstNum + secondNum;
}
private int getDigFromConsole() {
InputStreamReader stdin = new InputStreamReader(System.in);
BufferedReader bufin = new BufferedReader(stdin);
int ret = 0;
String str = null;
while (true) {
try {
str = bufin.readLine();
} catch (IOException e) {
e.printStackTrace();
}
finally
{
try {
stdin.close();
bufin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (!Pattern.matches("\\d+", str)) {
System.out.println("need to input number");
} else {
}
 try {
 ret = Integer.parseInt(str);
 break;
 } catch (NumberFormatException e) {
 System.out.println("NumberFormatException");
 }
}
return ret;
}

解决方案 »

  1.   

    java的io流使用了decorator (装饰器,也不知道拼的对不对)模式
    虽然你每次都new了InputStreamReader 但是只是把System.in包装了一下。
    而System.in已经在你第一次进入循环是关闭了
    so你要在真的写完了之后再关闭。
      

  2.   

    1.stdin, bufin每次调用都会产生新实例,为什么会产生"Stream closed"的错误?
    第一个问题楼上已经讲了。
      2 finally块在while循环中,每次都会执行么
    finallay是每次try{}catch后都会执行的。跟循环没关系。
      3 str = bufin.readLine();会一直等待输入么?还是没有用户输入就会跳转到finally块执行。
    bufin.readLin();以后程序会一直等待你的输入后才继续往下执行。因为他们是同一个线程中。