如何优雅地使java.util.Scanner再次等待输入?

时间:2011-11-02 16:31:30

标签: java java.util.scanner

我有一个程序的以下部分,它模拟了一个非常基本的菜单。

while (true) {
    int selection;
    try {
        selection = scanner.nextInt();
    } catch (Exception e) {
        selection = -1;
    }
    switch (selection) {
    case 0:
        System.exit(0);
    default:
        System.out.println("No valid selection!");
    }
}

现在,每当我输入而不是整数时,selection都会设置为-1并打印错误消息。但是,循环无休止地继续,Scanner不等待任何输入。

我怎么告诉它再等一下?如何在格式错误的用户输入上更优雅地失败呢?

3 个答案:

答案 0 :(得分:6)

Scanner无法读取某些内容时,违规数据 从流中删除,这意味着任何后续读取都将再次失败,直到数据被清除。

要解决此问题,您可以在失败时阅读并忽略结果:

try {
    selection = scanner.nextInt();
} catch (Exception e) {
    selection = -1;
    scanner.next(); // discard the input
}

答案 1 :(得分:1)

在您的情况下,不确定抛出和捕获异常是否相关。

尝试:

boolean isValid = false;
int selection;
while(!isValid) {
    isValid = scanner.hasNextInt();
    if(!isValid) {
        System.out.println("No valid selection!");
        scanner.next();
    } else {
        selection = scanner.nextInt();
    }
}
if(selection == 0) {
    System.exit(0);
}

答案 2 :(得分:-3)

让一些用户输入退出/中断while循环。就像用户在循环停止时进入“退出”一样。

除此之外,您还可以执行以下操作:

catch (Exception e) {
    selection = -1;
}
switch (selection) {
case 0:
    System.exit(0);
default:
    System.out.println("No valid selection!");
    System.out.println("Try again!");
    selection = scanner.nextInt();        
}