扫描程序 - java.util.NoSuchElementException

时间:2013-12-23 08:24:52

标签: java nosuchelementexception

有没有人看到这个问题?第一个输入工作正常,但在第一个循环之后,它不会要求再次输入值。我该如何解决这个问题?

    int value;
    while(true)
    {
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter a value");
        try 
        {
            value = scan.nextInt();
            System.out.println("value provided is: " + value);
            scan.nextLine(); // consumes "\n" character in buffer
        }
        catch(InputMismatchException e) // outputs error message if value provided is not an integer
        {
            System.out.println("Incorrect input type. Try again.");
            continue; // restarts while loop to allow for re-entering of a valid input
        }
        scan.close();
    }

3 个答案:

答案 0 :(得分:5)

scan.close();移至while循环之外。

此外,您不必在每次迭代时构建 new Scanner。将声明也移到循环外部。


close 扫描程序时,会关闭System.in输入流。

所以现在当你尝试再次实例化它时,它找不到任何打开的流,你会得到那个例外。

答案 1 :(得分:0)

在while循环结束时,您编写了scan.close()。这将关闭扫描仪,防止进一步扫描。删除该语句将确保您的while循环不断询问您的数字(在您的情况下将是一个无限循环)

此外,scan.nextInt()实际上会忽略所有新行并等待,直到您实际输入一个数字并按Enter键。因此,scan.nextLine()可以省略。只有在您使用scan.nextLine()获取输入的值时才需要。在这种情况下,新行字符也会被读取为输入,因此您需要额外的nextLine()调用来使用它。

答案 2 :(得分:0)

当您执行scan.close()时,它会关闭基础System.in流。因此,在下一次迭代中,它将无法阅读。

例如:

import java.io.IOException;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        int value;
        while (true) {
            Scanner scan = new Scanner(System.in);
            System.out.println("Enter a value");
            try {
                value = scan.nextInt();
                System.out.println("value provided is: " + value);
                scan.nextLine(); // consumes "\n" character in buffer
            } catch (InputMismatchException e) // outputs error message if value
                                                // provided is not an integer
            {
                System.out.println("Incorrect input type. Try again.");
                continue; // restarts while loop to allow for re-entering of a
                            // valid input
            }
            scan.close();
            try {
                int x = System.in.read();
                System.out.println(x);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

输出:

Enter a value
10
value provided is: 10
Enter a value
java.io.IOException: Stream closed
    at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:162)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:206)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:254)
    at Main.main(Main.java:24)
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.nextInt(Scanner.java:2160)
    at java.util.Scanner.nextInt(Scanner.java:2119)
    at Main.main(Main.java:12)

查看此问题了解更多信息:

Is it safe not to close a Java Scanner, provided I close the underlying readable?