问题描述
实验过程中在使用Scanner对象来进行命令行输入的过程中,关闭输入流时会抛出如下的异常
Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1540)
at monkeycrossriver.ScannerTest.main(ScannerTest.java:13)
不关闭输入流这个问题就消失了(曾经都是这么解决过来的)。后来了解到如果像这种输入流不关闭的话,会占用内存,所以查询了一些东西来解决这个问题。
问题解决
首先重现问题,最开始我以为是Scanner对象不能同时使用两次,但是执行了相关代码发现并不是这个原因引起的。后来发现程序中是有定义多个Scanner对象,而且错误的发生就在上一次Scanner关闭之后下一个Scanner开始读取命令行的输入过程中抛出的异常。意识到可能是因为关闭了一个Scanner影响了另一个Scanner的行为,所以执行了以下代码
public static void main(String[] args) {
Scanner input1 = new Scanner(System.in);
int a = Integer.parseInt(input1.nextLine());
input1.close();
System.out.println(a);
Scanner input2 = new Scanner(System.in);
String c = input2.nextLine();
System.out.println(c);
input2.close();
}
发现果然抛出的相关的异常,查询相关资料,发现System.in是“标准”输入流。此流已打开并准备提供输入数据。通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。 如果执行了close()方法,相当于是关闭了标准输入流,所以会影响到所有的标准输入流。
思考反思
所以说,Scanner(System.in)的对象存在多个是无意义的,而且作为标准输入流也无需去区分不同的场合用什么不同的Scanner,所以完全可以将Scanner对象定义为全局的对象,并实现相关的方法在不再需要它的地方执行close()方法。public class ScannerTest {
private static final Scanner in = new Scanner(System.in);
public static void main(String[] args) {
int a = Integer.parseInt(in.nextLine());
System.out.println(a);
String c = in.nextLine();
System.out.println(c);
in.close();
}
}