如何防止 java.util.Scanner 在从 System.in 读取时抛出 NoSuchElementException?[复制]

How can I prevent java.util.Scanner from throwing NoSuchElementException when reading from System.in? [duplicate]

提问人:Irish Jet 提问时间:11/17/2021 更新时间:11/17/2021 访问量:49

问:

我试图使用 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();catchuserInput

爪哇岛 java.util.scanner nosuchelementexception system.in

评论

0赞 Nowhere Man 11/17/2021
当关闭创建的实例时,也会出现这个著名的问题,因此之后无法读取用户输入。ScannerSystem.inSystem.in

答:

1赞 rzwitserloot 11/17/2021 #1

要么您关闭了 System.in,要么下一个令牌无法解析为双精度。这可能是一个问题;它们都会导致 .NoSuchElementException

您关闭了System.in

也许您在调用此代码之前关闭了它(幸运的是,它不会关闭),这比您想象的要容易。这将做到这一点:System.in

try (Scanner s = new Scanner(System.in)) {
 // stuff here
}

在尝试块完成后,System.in 现在被关闭了(解决方案:不要关闭;也不要关闭任何你包裹的东西)。System.inSystem.in

那里没有替身

也可能只是下一个可用的令牌不是双倍的,那么你也会得到这个完全相同的行为。要“检测”它,请拨打电话,看看你是否得到了一些东西(以及,它是什么,例如通过打印它)。可能是您正在输入并且系统希望您使用点作为小数分隔符(例如 ),从而得出下一个令牌不是双精度,并抛出相同的异常。.next()5,205.20

评论

0赞 Irish Jet 11/17/2021
那么,关闭扫描仪读数 System.in 会自行关闭 System.in?这是否意味着我永远不应该关闭从 System.in 读取的扫描仪?
0赞 rzwitserloot 11/17/2021
@IrishJet是的。切勿关闭这些扫描仪。不幸的是,现在的 IDE 往往会提供开箱即用的相当广泛的 linting(linting = 将代码行标记为糟糕的代码样式/危险),并且它们可以将其标记为“危险”。忽略那些 linters;设计的 Java 生态系统实际上无法正确确定何时应该关闭资源,何时不应该关闭资源。 System.in 就是一个很好的例子。