1

我有一个非常简单的循环,它等待一个数字(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)(debug),除非它不打印该消息而只是跳转到Error, input must be numberand Invalid command

有什么东西卡在我的输入缓冲区中,我可以刷新它吗,为什么它(输入缓冲区)卡住了(带有随机数据)???

如果我能弄清楚如何查看它,我将再次尝试调试并查看我的输入缓冲区中卡住了什么。

4

2 回答 2

2

问题在于调用input.close()- 这会导致底层输入流被关闭。当输入流被关闭时System.in,会发生不好的事情(即,您不能再从标准输入读取)。删除这条线应该没问题。

于 2012-12-27T20:05:42.360 回答
1
     input.hasNextInt()

如果没有 Integer,则此行将引发异常,因此它不会将 else 向前阻止以 catch 块。如果捕获到异常,它将永远不会进入 else 块。

于 2012-12-27T19:37:27.073 回答