【发布时间】:2021-08-04 16:38:39
【问题描述】:
我正在测试 Scanner 和 Bufferedreader。我在使用 Scanner 后尝试使用 BufferedReader。
但是,如果我关闭扫描仪,则会出现错误。为什么会出错?
我试过谷歌搜索,但我不明白。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Scanner;
public class ScannerAndBufferedReaderTest2 {
public static void main(String[] args) throws IOException {
// Scanner
Scanner sc = new Scanner(System.in);
System.out.print("Enter number : ");
int in1 = sc.nextInt();
sc.close(); // <-- If I erase this part, there will be no error.
System.out.println("Your number : " + in1);
// BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write("Enter number: ");
bw.flush();
int in2 = Integer.parseInt(br.readLine());
br.close();
bw.write("Your number : " + String.valueOf(in2));
bw.flush();
bw.close();
}
}
/* Error
Exception in thread "main" java.io.IOException: Stream closed
at java.base/java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:176)
at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:342)
at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
at test.Test2.main(Test2.java:27)
*/
【问题讨论】:
-
Closing Scanner 会导致关闭其数据源,这里是
System.in(代表标准输入),这会阻止使用它的父亲。 -
简而言之:不要关闭你没有打开的东西。 Standard in 是由 JVM “连接”的,所以让 JVM 关闭它。
标签: java java.util.scanner bufferedreader system.in