【问题标题】:How can I prevent java.util.Scanner from throwing NoSuchElementException when reading from System.in? [duplicate]从 System.in 读取时,如何防止 java.util.Scanner 抛出 NoSuchElementException? [复制]
【发布时间】:2021-11-16 22:08:20
【问题描述】:

我正在尝试使用 Scanner.nextDouble(); 向用户询问双精度值;但在我有机会输入任何内容之前,我得到了 NoSuchElementException。从我在文档中可以看到,这意味着 Scanner 位于输入的末尾。但是,我不明白当扫描程序从 System.in 读取而不是文件时会发生这种情况。

是否有可能是打开其他扫描仪导致了这种情况?我不认为 应该 是这种情况,因为在打开和关闭另一个 Scanner 的代码之前成功运行了另一种方法。但我对 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();

在那之后还有更多,但异常总是在userInput.nextDouble(); 处引发。 catch 块只是在寻找 InputMismatchException,我在返回一个有效的 double 之前关闭了 userInput

【问题讨论】:

  • 当关闭在System.in 上创建的Scanner 实例同时关闭System.in 时会出现这个著名的问题,因此之后无法读取用户输入。

标签: java java.util.scanner nosuchelementexception system.in


【解决方案1】:

要么您关闭了 System.in,要么下一个标记无法解析为双精度。这可能是任何一个问题;它们都会产生NoSuchElementException

你关闭了System.in

也许您在调用此代码之前关闭了它(幸运的是,它没有关闭System.in),这比您想象的要容易。这样就可以了:

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

在 try 块完成后,System.in 现在已关闭(解决方案:不要关闭 System.in;也不要关闭您包裹在 System.in 周围的任何东西)。

那里没有双份

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

【讨论】:

  • 那么,关闭从 System.in 读取的 Scanner 会关闭 System.in 本身吗?这是否意味着我永远不应该关闭从 System.in 读取的扫描程序?
  • @IrishJet 是的。永远不要关闭这些扫描仪。不幸的是,如今的 IDE 往往会附带相当广泛的 linting 配置,开箱即用(linting = 将代码行标记为不良代码风格/危险),他们可以将其标记为“危险”。忽略那些短绒;设计的 Java 生态系统实际上无法正确确定何时应该关闭资源以及何时不应该关闭资源。 System.in 就是一个很好的例子。
猜你喜欢
  • 2014-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 2011-08-25
  • 2015-01-30
相关资源
最近更新 更多