5

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

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

3 回答 3

5

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

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


Scannerclose时,这将关闭输入流。System.in

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

于 2013-12-23T08:27:44.790 回答
0

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

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

于 2013-12-23T08:38:30.990 回答
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)

检查此问题以获取更多信息:

如果我关闭底层可读文件,不关闭 Java Scanner 是否安全?

于 2013-12-23T08:41:00.867 回答