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

第二个 java.util.Input.. 问题是为什么当我只在第一次通话时写错号码时他会弹出?

4

2 回答 2

3

当给定的输入与预期的不匹配时,nextInt不会消耗输入。从文档中

当扫描器抛出 InputMismatchException 时,扫描器不会传递导致异常的令牌,以便可以通过其他方法检索或跳过它。

一个解决方案是跳过 catch 子句中的无效输入,例如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

假设这sc是一个java.util.Scanner...

Scanner 类通过(概念上)将输入拆分为标记,然后处理标记来工作。如果您sc.nextInt()在下一个标记与整数的语法不匹配时调用,则该调用将引发该异常。

但是,如果nextXxx方法抛出异常,它不会“消耗”下一个标记。相反,它将它留在扫描仪的令牌流中......所以当您再次调用sc.nextInt()时,它将尝试再次解析相同的令牌并抛出相同的异常。

要丢弃令牌,您需要调用sc.next(). 或者,如果您想丢弃整行,请调用sc.nextLine().

于 2013-03-29T12:41:45.773 回答