提问人:giotto1 提问时间:3/24/2022 最后编辑:giotto1 更新时间:3/24/2022 访问量:54
为什么我得到此代码的 NoSuchElementException?Java 方法,为用户提供第二次正确输入的机会
Why am I getting NoSuchElementException for this code? Java method for giving users a second chance for correct input
问:
我正在编写一个程序,我的代码遇到了一些问题。我调用了一个调用的方法,该方法为用户提供了第二次输入有效输入的机会。该方法定义如下:secondChance()
Scanner input2 = new Scanner(System.in);
StringBuilder html = new StringBuilder();
String val;
try {
System.out.println("Please enter file name you would like to view (include .csv at the end):");
String fileName = input2.nextLine(); //LINE 191
if (!(fileName.equals("doctorList.csv"))) {
input2.close();
throw new FileNotFoundException();
} else {
BufferedReader br = new BufferedReader(new FileReader(file2));
while ((val = br.readLine()) != null) {
html.append(val);
}
br.close();
input2.close();
String output = html.toString();
System.out.println(output);
}
} catch (FileNotFoundException e) {
System.out.println("Invalid file input. Terminating program.");
System.exit(0);
} catch (IOException e) {
System.out.println("Error occured. Terminating program.");
input2.close();
System.exit(0);
}
}
我得到的输出/错误是:
Please enter file name you would like to view (include .csv at the end):
Exception in thread "main" java.util.NoSuchElementException: No line found
at java.base/java.util.Scanner.nextLine(Scanner.java:1651)
at CSV2HTML.secondChance(CSV2HTML.java:191)
at CSV2HTML.main(CSV2HTML.java:68)
异常中的第 68 行是调用该方法的行。方法中用于询问用户输入的代码与 secondChance() 方法中显示的代码相同。作为参考,下面是调用 secondChance() 方法的代码:
} catch (FileNotFoundException e) {
System.out.println("Invalid file input. Now initiating second chance.");
secondChance(); //THIS IS LINE 68
}
编辑:我在代码块的顶部添加了 input2,以显示它的初始化位置/方式。
答:
抛出该异常只有 2 种解释。从你写问题的方式来看,这里只有这两个中的一个是可行的:scanner.nextLine()
你 System.in!close()
System.in 是您的应用程序标准输入。假设您刚刚像往常一样启动应用程序,那将是“键盘”,实际上是无穷无尽的,因此通常不会发生异常。如果你以 ,你告诉操作系统用作“键盘”,这肯定会用完行,这是另一个不太可能的解释。(如果你真的以这种方式启动你的应用程序,那么这就是你的解释:扫描仪消耗了所有行。您的代码中可能存在一个错误,导致读取“太多”行,请使用调试器逐步执行)。java -jar yourapp.jar <somefile.txt
somefile.txt
但是,您可以关闭此资源,这意味着任何进一步尝试从 System.in 读取都将失败,就像您看到的那样。解决方案很简单:永远不要关闭 System.in
。
扫描程序是一个筛选器,如果关闭扫描程序,则扫描程序将关闭基础资源。因此,假设您有一个 System.in () 的扫描程序,则规则“do no close System.in”将扩展为:“...也永远不要关闭这些扫描仪”。new Scanner(System.in)
你要么写过:
scanner.close();
或者你写了:
try (Scanner s = new Scanner(System.in)) {
// stuff with scanner here
}
当代码“走出”try 块时,该构造会调用 try 括号中事物的方法,而不管它如何走出(控制流,例如语句、抛出异常或只是跑到它的末尾)。close()
return
某些 IDE 会注意到您正在使用标记为资源的类(甚至只是上述任何可以在 try-with 中使用的类),并会警告您应该使用 try-with。编辑器/棉绒工具是错误的,您必须忽略它。“哪些东西应该关闭或不关闭”的概念比这些简单的工具要复杂得多。这是您实际上不能关闭的资源之一。
摆脱它。删除/替换:scanner.close()
try (Scanner s = new Scanner(System.in)) {
codeHere();
}
只需:
Scanner s = new Scanner(System.in);
codeHere();
评论
input2
nextLine()
file2
html
input2
new Scanner(System.in)
.close()