【问题标题】:Scanner - java.util.NoSuchElementException扫描仪 - java.util.NoSuchElementException
【发布时间】:2013-12-23 08:24:51
【问题描述】:

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

    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();
    }

【问题讨论】:

  • 循环何时真正停止?
  • 没关系,我可以让它随时停止,但主要焦点是错误
  • 这只是从我的实际代码中提取的,我只是将它设置为一个无限循环来调查这个特定的情况
  • 注意,我将使用同一个扫描仪来读取整数和字符串

标签: java nosuchelementexception


【解决方案1】:

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

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


close 扫描器 时,这会关闭System.in 输入流。

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

【讨论】:

  • 是否存在需要为一个程序实例化多个扫描仪的情况?
  • 我的逻辑有什么问题?我打开然后关闭扫描仪......在下一次迭代中重复。我不明白我的问题是什么
  • 由于close() 关闭了底层流,因此在下一次迭代中将没有任何内容可读取。请参阅this 帖子。
  • 但它不是又被打开了吗?此行在下一次迭代中再次执行 -> Scanner scan = new Scanner(System.in);
  • 为什么没有东西可以阅读?我的理论是,在第二次迭代中,它会重新打开并再次要求提供值。为什么不是这样?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    当您执行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?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-07
      • 2013-02-08
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多