hasNextInt()从扫描仪表现得很奇怪

时间:2012-12-27 19:28:37

标签: java user-input java.util.scanner

我有一个非常简单的循环,等待一个数字(int),只要该数字不是exitOption它不会离开循环,但是我得到一个意外的错误,我不知道是什么导致了它。

修改

添加另一个代码段,以便您可以编译

public static void main(String[] args) throws   FileNotFoundException,
                                                SecurityException,
                                                IOException,
                                                ClassNotFoundException {


    while (controller.selectOptionMM());

/修改

public boolean selectOptionMM() throws  SecurityException, 
                                        FileNotFoundException, 
                                        IOException {

    int cmd = ui.getExitOption();

    ui.mainMenu();
    cmd = utils.readInteger(">>> "); // this is my problem, right here
                                     // code in next snippet 
    while (cmd <1 || cmd > ui.getExitOption()) {
        System.out.println("Invalid command!");
        cmd = utils.readInteger(">>> ");
    }

    switch (cmd) {
    case 1: 
    case 2: 
    case 3: 
    case 4: this.repository.close();
            return true;
    case 5: return false;
    }

    return false;
}

以下是失败的原因:

public int readInteger(String cmdPrompt) {
    int cmd = 0;
    Scanner input = new Scanner(System.in);

    System.out.printf(cmdPrompt);
    try {
        if (input.hasNextInt()) 
            cmd = input.nextInt(); // first time it works
            // Second time it does not allow me to input anything
                            // catches InputMissmatchException, does not print message
                            // for said catch
                            // infinitely prints "Invalid command" from previous snippet

    } catch (InputMismatchException ime) {
        System.out.println("InputMismatchException: " + ime);
    } catch (NoSuchElementException nsee) {
        System.out.println("NoSuchElementException: " + nsee);
    } catch (IllegalStateException ise) {

    } finally {
        input.close(); // not sure if I should test with if (input != null) THEN close
    }


    return cmd;
}

第一次我通过低谷,它读取数字没问题。现在,如果数字不是5(在这种情况下是exitOption),它再次通过readInteger(String cmdPrompt),除非它跳转到catch (InputMismatchException ime)(调试),除了它不打印该消息并且只跳转到{{ 1}}和Error, input must be number

我的输入缓冲区中是否存在某些东西,我可以将其刷新,为什么它(输入缓冲区)卡住(随机数据)???

我会再次尝试调试,看看我的输入缓冲区中有什么问题,如果我能弄清楚如何看到它。

2 个答案:

答案 0 :(得分:2)

问题在于对input.close()的调用 - 这会导致基础输入流被关闭。当关闭的输入流是System.in时,会发生不好的事情(即,您无法再从stdin读取)。你应该没关系就行了。

答案 1 :(得分:1)

     input.hasNextInt()

如果没有Integer,则该行抛出异常,因此它不会阻止它向前阻塞。如果异常被捕获,它将永远不会阻止。