1

こんにちは、私はこのコードを実行しています:

public static int chooseOption() {
    int choice = 0;
    System.out.println("Enter number [1, 2, 3..]");

    do {
        try { 
            choice = sc.nextInt();
        } catch ( java.util.InputMismatchException e ) {
            System.out.println(e);
            break;
        }
    } while( choice == 0 || choice < 0);


    return choice;
}


public static String chooseCom() {
    String choice = new String();
    int commNumber = 0;

    System.out.println("Choose your COM port");
    commNumber = chooseOption();

    choice = "COM" + commNumber;
    System.out.println(choice);
    return choice;
}

その後、私は電話します - >

Helper.chooseOption();

Helper.chooseCom();

そして、最初の呼び出し 1.1 または単に間違った float(double) 値に書き込むと、出力は次のようになります。

Enter number [1, 2, 3..]
1.1
java.util.InputMismatchException
Choose your COM port
Enter number [1, 2, 3..]
java.util.InputMismatchException
COM0

2番目のjava.util.Input ..は、最初の呼び出しでのみ間違った番号を書いたときに、なぜ彼がポップしているのかという問題です?

4

2 に答える 2

3

期待されるものと一致しない入力が与えられた場合nextInt、入力を消費しません。ドキュメントから

スキャナーが InputMismatchException をスローすると、スキャナーは例外の原因となったトークンを渡さないため、他の方法でトークンを取得またはスキップできます。

解決策は、たとえば次のように、catch-clause の無効な入力をスキップすることですnextLine

    try { 
        choice = sc.nextInt();
    } catch ( java.util.InputMismatchException e ) {
        System.out.println(e);
        sc.nextLine(); // skip the entire line
        break;
    }
于 2013-03-29T12:38:08.900 に答える
3

それscjava.util.Scanner...

Scanner クラスは、(概念的に) 入力をトークンに分割し、トークンを処理することによって機能します。sc.nextInt()次のトークンが整数の構文と一致しないときに呼び出すと、その呼び出しはその例外をスローします。

ただし、nextXxxメソッドが例外をスローした場合、次のトークンを「消費」しません。代わりに、スキャナーのトークン ストリームに残します。そのため、もう一度呼び出すとsc.nextInt()、同じトークンを再度解析して同じ例外をスローしようとします。

トークンを破棄するには、 を呼び出す必要がありますsc.next()。または、行全体を破棄する場合は、 を呼び出しますsc.nextLine()

于 2013-03-29T12:41:45.773 に答える