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)(デバッグ) にジャンプしますが、そのメッセージは出力せず、 と にジャンプするだけError, input must be numberですInvalid command

入力バッファに何か詰まっていますか?フラッシュできますか?(入力バッファ)が(ランダムデータで)詰まっているのはなぜですか???

再度デバッグを試みて、入力バッファにスタックしているものを確認します。それを確認する方法がわかれば。

4

2 に答える 2

2

問題はへの呼び出しにありますinput.close()-これにより、基になる入力ストリームが閉じられます。閉じられている入力ストリームがである場合System.in、悪いことが起こります(つまり、stdinから読み取ることができなくなります)。この行を削除するだけで大​​丈夫です。

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

この行は、Integer がない場合に例外をスローするため、else ブロックする代わりに、ブロックをキャッチするために前方にブロックします。例外がキャッチされた場合、else ブロックに移動することはありません。

于 2012-12-27T19:37:27.073 に答える