日期:2014-05-20  浏览次数:20770 次

java io 异常,求教!
请看代码:

public class test {
public static void main(String[]args) throws Exception{
String s2  = readScanner("请输入:");
System.out.println("这是你Scanner输入的:"+s2);
String str = readString("请输入:");
System.out.println("这是你输入的"+str);
}
private static String readString(String prompt) throws IOException{
String str = null ;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print(prompt);
str = br.readLine() ;

return str ;
}
private static String readScanner(String prompt){
String retStr = null ;
System.out.print(prompt);
Scanner scanner = new Scanner(System.in);
retStr = scanner.nextLine();
scanner.close();

return retStr ;
}
}


结果和报错如下:

请输入:ggreg
这是你Scanner输入的:ggreg
请输入:Exception in thread "main" 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 test.readString(test.java:20)
at test.main(test.java:13)


问题1:
    这个程序,如果把readScanner(String prompt)中的scanner.close();注释掉,程序就正确了!
而有了scanner.close(),就如上面报错!

问题2:
    我跟踪Debug,跟踪到BufferedReader中的readLine()后,出现IOException!!!
我就怪了,我在readScanner(String prompt)中写了scanner.close(),结果在readString(String prompt)中的str = br.readLine();报IOException!

------解决方案--------------------
System.in比较特殊,使用中是不需要关闭的。
------解决方案--------------------
System.in在你没有重定向的时候,对应的是程序的键盘输入,如果你在某个地方关闭了他以后,后面的程序就不能使用了,所以后面的reader才会报异常