提问人:Irish Jet 提问时间:11/17/2021 更新时间:11/17/2021 访问量:49
如何防止 java.util.Scanner 在从 System.in 读取时抛出 NoSuchElementException?[复制]
How can I prevent java.util.Scanner from throwing NoSuchElementException when reading from System.in? [duplicate]
问:
我试图使用 Scanner.nextDouble() 向用户索要双精度值;但是在我有机会键入任何内容之前,我得到了一个 NoSuchElementException。从我在文档中看到的内容来看,这意味着扫描仪位于输入的末尾。但是,我不明白当扫描仪从 System.in 而不是文件读取时,这种情况是如何发生的。
是否有可能打开其他扫描仪会导致这种情况?我认为不应该是这样,因为在打开和关闭另一个扫描仪的代码之前成功运行了另一种方法。但是我对Scanner的来龙去脉(或其他很多东西)了解得还不够多,不知道这是否是问题所在。
这是我目前所处的位置,在多次尝试重写此代码以使其正常工作失败之后:
public static double collectDepositAmount(int accountNum){
System.out.print("Enter how much you would like to deposit in Account #" + accountNum + ": $");
Scanner userInput = new Scanner(System.in);
double finalDeposit;
try{
double inputDeposit;
inputDeposit = userInput.nextDouble();
在那之后还有更多,但例外总是被抛出.该块仅查找 InputMismatchException,并且在返回有效的双精度值之前关闭。userInput.nextDouble();
catch
userInput
答:
要么您关闭了 System.in,要么下一个令牌无法解析为双精度。这可能是一个问题;它们都会导致 .NoSuchElementException
您关闭了System.in
也许您在调用此代码之前关闭了它(幸运的是,它不会关闭),这比您想象的要容易。这将做到这一点:System.in
try (Scanner s = new Scanner(System.in)) {
// stuff here
}
在尝试块完成后,System.in 现在被关闭了(解决方案:不要关闭;也不要关闭任何你包裹的东西)。System.in
System.in
那里没有替身
也可能只是下一个可用的令牌不是双倍的,那么你也会得到这个完全相同的行为。要“检测”它,请拨打电话,看看你是否得到了一些东西(以及,它是什么,例如通过打印它)。可能是您正在输入并且系统希望您使用点作为小数分隔符(例如 ),从而得出下一个令牌不是双精度,并抛出相同的异常。.next()
5,20
5.20
评论
Scanner
System.in
System.in