我正在编写一个程序,要求用户通过在控制台中输入来从菜单中进行选择。
我是stackoverflow和java的新手,并且通过尽可能具体来安全地播放它。如果你发现它很冗长,请原谅。
我用enter" B"测试了代码。在提示时,情况是第一次迭代很好,但是当第二次迭代时,程序不再阻止输入并在控制台中给出以下错误消息(你可以在用星号评论后找到bug生成的地方) :
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at MainClass.main(MainClass.java:32)
public class MainClass {
public static void main(String[] args) {
AirlineClass theAirline = AirlineClass();
boolean stopAsking = false;
while (!stopAsking){
// display the menu
String menuContent = "A. Print List of all passengers.\n"
+ "B. Print List of flights.\n"
+ "C. Add a passenger to a flight.\n"
+ "D. Remove a passenger from a flight.\n"
+ "E. Print a List of passengers on a flight.\n"
+ "F. Exit.\n"
+ "Please enter your choice: ";
System.out.println(menuContent);
//create a Scanner object for input
Scanner reader = new Scanner(System.in);
String choice = reader.next().toUpperCase();
//*********************************
// bug here
reader.close();
switch (choice) {
case "A":
break;
case "B":
System.out.println("You have chose B");
break;
case "C":
break;
case "D":
break;
case "E":
break;
case "F":
System.out.println("Program exits, bye~");
stopAsking = true;
reader.close();
break;
default:
System.out.println("Invalid input detected, please try again");
reader.close();
break;
}
}
}
删除行reader.close()
后,程序运行正常。
我认为一个可能的原因可能是:
如果我reader.close()
,那么我创建的名称为reader
的每个扫描器对象都被视为已关闭。
如果有人能帮助我,我真的非常感激。如果我在提问的方式上犯了一些错误,请指出。
答案 0 :(得分:0)
将Scanner
的创建移到循环之外并同样关闭。所以你可以在每次迭代中重用相同的对象
Scanner reader = new Scanner(System.in);
String choice;
boolean stopAsking = false;
while (!stopAsking) {
// print menu
// read data
choice = reader.next().toUpperCase();
// switch block with stopAsking = true;
}
reader.close();
答案 1 :(得分:0)
您应该在循环之前创建Scanner
,这样您每次需要获取用户输入时都可以使用相同的对象。
此外,Scanner(System.in)
个对象不一定是close()
d,因为close()
也会关闭System.in
流。在使用close()
时忘记Scanner(System.in)
,你会没事的。有关详细信息,请查看答案here。