我目前在我的项目中使用两个不同的扫描程序,分别是两个不同的类:用户输入执行不同的操作。调用第一台扫描仪工作正常,但是当我尝试调用第二台扫描仪时,即使我关闭了第一台扫描仪,它也会将输入注册为空。
第1类
Scanner scan = new Scanner(System.in);
public void foobar(){
System.out.println("Enter data: ");
String foo = scan.next();
scan.close();
class2.function(foo);
}
第2类
Scanner scan1 = new Scanner(System.in);
public void foobar1(String foo){
System.out.println("Enter more data: ");
String fooo = scan1.Next();
//Automatically prints null here and closes program
}
我应该只以某种方式使用一台扫描仪吗?或者我以其他方式使用Scanner类?谢谢!
答案 0 :(得分:3)
scan.close();
也会关闭System.in
,以便无法从流中读取更多数据。因此,当您从scan1
开始阅读时,System.in
将不再返回任何数据。
因此,如果您对所有实例使用相同的输入流,则在完成所有扫描之前不要关闭任何Scanner
实例。
查看Scanner#close()
的文档以获取更多信息。
关闭此扫描仪。 如果此扫描程序尚未关闭,那么如果其底层可读也实现了Closeable接口,则将调用可读的close方法。
如果您查看System.in
的文档,就可以看到它确实实现了Closeable
接口。
因此,InputStream#close()
被调用并关闭InputStream
而没有输入流来从中读取数据。
关闭此输入流并释放与该流关联的所有系统资源。
答案 1 :(得分:1)
无需创建两个扫描程序,您可以对两者使用相同的Scanner
,因为一旦扫描关闭,流System.in
也会关闭。
像:
Scanner scan = new Scanner(System.in);
public void foobar(){
System.out.println("Enter data: ");
String foo = scan.next();
class2.function(foo,scan);
}
其中:
public void function(String foo,Scanner scan1){
System.out.println("Enter more data: ");
String fooo = scan1.next();
System.out.println(fooo);
}
但如果您需要创建两个扫描程序,仍然可以在class1中使用scan.reset();
而不是scan.close();