NoSuchElementException Java Scanner *未关闭扫描程序*

时间:2014-09-08 13:32:53

标签: java java.util.scanner

我刚刚测试了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);
     }
}

5 个答案:

答案 0 :(得分:0)

您需要检查是否有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);

答案 1 :(得分:0)

我不确定您提供什么输入来获取此错误,但我可以想象当您将其他输入字符串传递给此程序时,或者您在控制台中键入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...");
        }
     }
}

答案 2 :(得分:0)

在线运行相同的程序:http://www.jdoodle.com/

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

在线编辑可能会以不同的方式工作(在某些情况下),因此您无法获得所需的结果。

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

答案 3 :(得分:0)

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

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

如果此行也提供相同的异常,则标准输入存在问题。尝试使用默认设置重新安装JVM。

PS:你的代码适用于我

答案 4 :(得分:0)

问题是当未输入任何内容时,扫描程序会尝试从输入流中获取数字。

解决此问题的方法是等待Scanner.hasNextDouble()为true,以便它尝试在输入输入数字后对其进行读取。

while(!input.hasNextDouble()) { }

x = input.nextDouble();