[英]Correct use of java.util.scanner in a loop?
import java.util.Scanner;
public class MainMenu {
public MainMenu(){
int x = 1;
Scanner menuIn = new Scanner(System.in);
while ( x == 1 ){
String pick = "0";
System.out.println("--== Household Admin v1.0 ==--");
System.out.println("(A)dd Resident");
System.out.println("(R)emove Resident");
System.out.println("(L)ist Resident(s)");
System.out.println("pick = " + pick);
System.out.print("#: ");
pick = menuIn.nextLine();
System.out.println("pick = " + pick);
switch (pick) {
case "A":
case "a":
Resident.residentList.add( Resident.newResident() );
break;
case "R":
case "r":
break;
case "L":
case "l":
break;
case "Q":
case "q":
x = 0;
break;
default:
System.out.println("WRONG! Try again.");
break;
}
}
menuIn.close();
}
}
第一次通过循环,一切都会按预期进行。 我第二遍循环:
线程“主”中的异常java.util.NoSuchElementException:家用处的java.util.Scanner.nextLine(Scanner.java:1540)处找不到线。家用处的MainMenu。(MainMenu.java:26)处没有线。 .java:7)
我不确定如何“重置”扫描仪对象以便能够再次使用它。
您在MainMenu
构造函数中拥有完整的代码,在其中通过调用menuIn.close();
关闭扫描仪menuIn.close();
这是根本原因。
看来您是从MyFirstGame
内部的main
方法创建MainMenu
新实例。 现在,如果您在扫描程序对象上调用.close()
,它将关闭基础流。 因此,您的第一个对象被成功创建。 但是,当您尝试实例化MainMenu
第二个对象时,由于System.in
流已关闭,您将收到此异常。
理想情况下,您应该使用单个扫描仪对象读取用户输入。 不必每次都在构造函数中创建新的扫描程序对象,而只需在main方法中创建一个扫描程序对象并将其作为参数传递给构造函数。 像下面这样。
在MyFirstGame.main
Scanner menuIn = new Scanner(System.in);
MainMenu mainMenu1= new MainMenu(menuIn);
MainMenu mainMenu2= new MainMenu(menuIn);
//.... and So on
//and close scanner object here once you have created all reaquired object.
menuIn .close();
在您的MainMenu中,将构造函数更改为
public MainMenu(Scanner menuIn ){
并从构造函数中删除以下几行
//Scanner menuIn = new Scanner(System.in);
//menuIn.close();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.