为什么Scanner似乎每次调用nextInt时都不会寻找新的int

时间:2014-10-10 23:13:23

标签: java java.util.scanner

为什么它会在while循环中继续重复“请输入一个有效的数字”并且不断停止让用户输入内容。

        while (true) { //This will continually run until something is returned, AkA the number 1 or 2
        Scanner s = new Scanner(System.in);
        try {
            input = s.nextInt();
        } catch (Exception e) {
            System.out.println("Please enter a valid number!");
        }
        s.close();
    }

当我使用调试器时,似乎没有任何问题导致此问题,并且不会引发任何错误。造成这个问题的原因是什么?如何解决?

2 个答案:

答案 0 :(得分:1)

关闭扫描程序 如果实现Closable接口,则关闭基础流。

在这种情况下,这是System.in,一旦关闭,您将无法再次使用它创建扫描仪。

有关详细信息,请参阅http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#close()

但是,即使您解决了这个问题,nextInt的异常也不会使流指针前进,因此,下次调用它时,它会再次在输入流中找到完全相同的数据。

您需要在再次尝试之前清除错误数据。由于您接受用户输入,因此一种解决方案是调用nextLine并将其丢弃;

string junk = s.nextLine();

答案 1 :(得分:0)

删除

s.close();

并在while循环之外定义您的Scanner对象,因为它不是问题。顺便说一句,我已经尝试过你的代码,它运行正常,直到我输入的输入不是int。当我输入一个字符串时,异常sysout语句会无限打印

所以你要添加

string junk = s.nextLine();

在您的异常块中,如paxdiablo所说,它不会不断重复。