java例外。util。NoSuchElementException:在java中找不到行。util。扫描仪。nextLine(Scanner.java:1585)
我一次又一次地提示用户输入,直到用户类型退出,在这种情况下,数据对象将被设置为null,并将离开循环。在大多数情况下,这段代码都是有效的,但有时我会在以下行中得到一个NoTouchElementException:。这往往发生在几个循环之后,而不是第一次通过。如果我在while循环的范围内声明reader变量,那么它将在第二个循环中失败
主要工作(有时抛出异常)
int level = 1;
Scanner reader;
String selection = null;
while (true) {
if (data.done) {
level--;
}
data.done = false;
System.out.println(getSubmenu(level, data));
reader = new Scanner(System.in);
if (level <6) {
selection = reader.nextLine();
} else {
level = 4;
}
if (validSelection(selection)) {
level = getLevel(level, selection);
data = getData(level, data, selection);
} else {
System.out.println("Invalid entry");
}
if (data == null) {
System.out.println("Level "+ level + "selection " + selection);
break; // exit command was typed
}
}
reader.close();
备用(在第二个循环中引发异常)
int level = 1;
String selection = null;
while (true) {
if (data.done) {
level--;
}
data.done = false;
System.out.println(getSubmenu(level, data));
Scanner reader = new Scanner(System.in);
if (level <6) {
selection = reader.nextLine();
} else {
level = 4;
}
if (validSelection(selection)) {
level = getLevel(level, selection);
data = getData(level, data, selection);
} else {
System.out.println("Invalid entry");
}
if (data == null) {
System.out.println("Level "+ level + "selection " + selection);
break; // exit command was typed
}
reader.close();
}
堆栈跟踪
java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1585)
at org.functional.utils.Menu.run(ServerScripts.java:61)
at org.functional.utils.ServerScripts.main(ServerScripts.java:18)
我错过了什么
# 1 楼答案
在代码开头分配
Scanner
,而不是每次通过循环:按照您的方式,在下一次循环迭代中,您创建的每个
Scanner
都是孤立的。没有一家被关闭。当从所有这些垃圾Scanner
对象中消耗一些内部资源时,最有可能出现异常