目前,我正在使用switch语句。当我有多个带有switch语句的循环时,我遇到了一个问题。
当我退出第二个switch语句(向上一个)时,Java会抛出java.util.NoSuchElementException
,我不太清楚为什么会这样做
switchOne = sc.nextInt();
应该触发新的用户输入?
我希望有人可以帮助我对此有所了解。
我还尝试使用scanner
而不使用try-with-resources
,但它也会出现同样的错误。
public static void main(String[] args) {
int switchOne = 0;
int switchTwo = 0;
boolean breakAdmin = false;
try(Scanner sc = new Scanner(System.in)) {
while(true) {
System.out.println("Select one of the options below");
System.out.println("1: Browse books");
System.out.println("2: Get a coffe");
System.out.println("3: See previously checkouts");
System.out.println("0: Exit");
System.out.print("Option: ");
switchOne = sc.nextInt();
switch(switchOne) {
case 0:
return;
case 1:
System.out.println("!!You choose to browse over books, woohoo!!");
break;
case 2:
System.out.println("!!Sit & relax");
break;
case 3:
System.out.println("!!Let me get that list for you");
break;
case 99:
System.out.println("We welcome you!");
try(Scanner sc2 = new Scanner(System.in)) {
while(!breakAdmin) {
System.out.println("0: exit");
System.out.println("1: something");
switchTwo = sc2.nextInt();
switch(switchTwo) {
case 0:
breakAdmin = true;
break;
case 1:
System.out.println("!!admin 1");
break;
default:
System.out.println("!!This is the default case");
break;
}
}
}
breakAdmin = false;
break;// case 99 ends
default:
System.out.println("!!This is the default case");
break;
} // switch block ends
} // while loop ends
} // try with resources ends
}
答案 0 :(得分:3)
try(Scanner sc2 = new Scanner(System.in)) {
try-with-resources构造关闭在try on exit中创建的资源,因此它调用sc2.close()
然后关闭System.in
。
在此之后,您尝试从另一个sc
读取,该System.in
尝试从try
读取。但由于已经关闭,因此不再需要阅读。
要修复只需删除第二个Scanner.readLine()
,就不需要关闭在那里创建的扫描仪。
编辑:另一个潜在的问题是输入流包含一个未被清除的非数字(例如换行符),因为它无法将其解释为一个数字,它将抛出声明的异常。处理用户输入时,最好只读取整行Integer.parseInt(...)
并自行转换输入,例如使用QGridLayout