【问题标题】:NoSuchElementException Java Scanner *not closing scanner*NoSuchElementException Java 扫描器 *未关闭扫描器*
【发布时间】:2014-09-08 13:32:52
【问题描述】:

我刚刚测试了 Java,并通过基本的 Scanner 交互得到了这个错误。

Value x: 
Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:907)
    at java.util.Scanner.next(Scanner.java:1530)
    at java.util.Scanner.nextDouble(Scanner.java:2456)
    at HelloWorld.main(HelloWorld.java:10)

我的代码是:

import java.util.Scanner;
import java.io.*;

public class HelloWorld{

     public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        double x;
        System.out.println("Value x: ");
        x = input.nextDouble();
        System.out.println(x);
     }
}

【问题讨论】:

  • 你输入的是什么?不是双标?
  • @user1071777 在这种情况下它应该抛出输入不匹配异常。
  • 试试这个solution
  • x = input.nextDouble(); x2 次看看。只是好奇
  • @joeyrohan,它仍然会在第一个 input.nextDouble() 时给我错误。

标签: java java.util.scanner


【解决方案1】:

您需要检查是否有 double 可以读取,最好同时提取无效数据 -

Scanner input = new Scanner(System.in);
double x;
System.out.println("Value x: ");
while (!input.hasNextDouble()) {
  if (!input.hasNext()) {
    System.err.println("no more input");
    System.exit(1);
  }
  System.out.println(input.next() + ": is not a double, please enter a double");
}
x = input.nextDouble();
System.out.println(x);

【讨论】:

  • 我也试过了。它只是打印出“不再输入”并退出。
  • @VikramMehta 这就是您的main() 方法中的全部内容吗?您使用的是真正的 Java 开发人员环境,还是使用在线工具?如果上面显示“不再输入”,则Scanner 无法读取System.in。通常,那是因为你已经关闭了System.in
  • 啊,可能是因为我使用的是在线编辑器。我不能在这个系统上拥有真正的 JDE。有道理,谢谢!
【解决方案2】:

我不确定你提供了什么输入来得到这个错误,但我可以想象当你将一些其他输入字符串传送到这个程序时,或者你在控制台中键入 ctrl-z 时会发生这种情况。

无论如何,发生的情况是您没有向扫描仪提供输入。

尝试使用.hasNext() 验证输入。

import java.util.Scanner;
import java.io.*;

public class HelloWorld{

     public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        double x;
        System.out.println("Value x: ");
        if (input.hasNext()) {
          x = input.nextDouble();
          System.out.println(x);
        } else {
          System.out.println("You didn't supply a value for x...");
        }
     }
}

【讨论】:

  • 另外:检查你是否真的得到双倍可能是个好主意(见其他答案)
  • 这是编译错误,不是运行时错误。当我使用 hasNext() 时,它只是跳过括号内的内容。
  • @VikramMehta 我认为你遗漏了一些东西。这就是所有代码吗?请提供所有详细信息。
  • @VikramMehta 显然......因为您没有向nextDouble() 提供任何输入。事实上,这就是hasNext() 的用途,以防止运行时错误。我将编辑代码以使其更清晰。
  • 啊,可能是因为我使用的是在线编辑器。我不能在这个系统上拥有真正的 JDE。有道理,谢谢!
【解决方案3】:

关于在线运行同一个程序:http://www.jdoodle.com/

我得到了相同的NoSuchElementException。建议Download JDK 8 并尝试运行相同的程序。

在线编辑器的工作方式可能不同(在某些情况下),因此您不会得到想要的结果。

但是,在上面的链接中,如果您事先输入标准输入,它可以正常工作。

【讨论】:

  • 啊,可能是因为我使用的是在线编辑器。我不能在这个系统上拥有真正的 JDE。有道理,谢谢!
  • 不客气 :) 如果回答对您有帮助,您可以点击绿色对勾接受。
【解决方案4】:

这看起来像是您的标准输入中的问题。尝试将这条线放在扫描仪上方,以确保您可以读取标准输入。然后再次运行,输入一些字母并检查您是否可以从标准输入中读取。

System.out.println((char)System.in.read());  

如果这一行也给出了相同的异常,则说明标准输入有问题。尝试使用默认设置重新安装 JVM。

PS:你的代码对我来说很好用

【讨论】:

    【解决方案5】:

    问题是扫描器在没有输入任何内容时试图从输入流中获取一个数字。

    解决这个问题的方法是等待 Scanner.hasNextDouble() 为真,以便它在输入后尝试读取输入的数字。

    while(!input.hasNextDouble()) { }
    
    x = input.nextDouble();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多