对键盘输入和运行检查

时间:2012-11-23 16:04:49

标签: java java.util.scanner

我有以下方法

    public static int modeChooser(){
    int choice = 0;
    Scanner kb = new Scanner(System.in);
    while(choice == 0){
        try {
        choice = kb.nextInt();  
        } catch (Exception e) {
            continue;
        }
        if(choice < 1 || choice > 5){
            continue;
        }
    }

    return choice;
}

目标是只允许用户输入1,2,3,4或5; 如果用户键入一个字符串或太高/太低的数字,该方法应该重新启动,直到我有正确的int。

以下是该流程的示例:

用户类型:1 - &gt;一切都好 用户类型:saddj - &gt;方法重启 - &gt;用户类型3 - &gt;好的

有什么想法吗?

7 个答案:

答案 0 :(得分:2)

更改为:

do {

    // read choice value

    if (choice < 1 || choice > 5) {
        // hint to user
    }

} while(choice < 1 || choice > 5);

答案 1 :(得分:1)

您可以直接在while条件中选择条件:

while(choice < 1 || choice > 5){
    try {
    choice = kb.nextInt();  
    } catch (Exception e) {
        continue;
    }
}

(在你当前的代码中,用户输入7,选择取值,while条件变为false,你的方法返回7,它不应该)。

而不是捕获异常,您可以使用hasNextInt()方法使代码更清晰:

public static int modeChooser() {
    int choice = 0;
    Scanner kb = new Scanner(System.in);
    while (choice < 1 || choice > 5) {
        if (!kb.hasNextInt()) {
            kb.next();
        } else {
            choice = kb.nextInt();
        }
    }

    return choice;
}

如果您确实想使用递归方法,它可能如下所示:

public static int modeChooser() {
    Scanner kb = new Scanner(System.in);
    while (!kb.hasNextInt()) {
        kb.next();
    }

    int choice = kb.nextInt();
    return (choice >= 1 && choice <= 5) ? choice : modeChooser();
}

答案 2 :(得分:1)

我认为您可以简单地将支票放入while条件中,如下所示:

while(choice < 1 || choice > 5){
    try {
        choice = kb.nextInt();  
    } catch (Exception e) { 
       //ignore the exception and continue
    }
}

答案 3 :(得分:1)

这种方式实际上很好用:

public static int modeChooser(){
    int choice = 0;
    Scanner kb = new Scanner(System.in);
    while(choice == 0){
        try {
        choice = kb.nextInt();  
        } catch (Exception e) {
            System.out.println("Sorry but you have to enter 1,2,3,4, or 5! Please try again.");
            choice = modeChooser();
        }

    }
    if(choice < 1 || choice > 5){
        System.out.println("Sorry but you have to enter 1,2,3,4, or 5! Please try again.");
        choice = modeChooser();
    }
    return choice;
}

答案 4 :(得分:1)

如果kb.NextInt()失败,输入流中的数据仍然存在,则需要跳过它。如果你没有跳过无效数据,循环将继续尝试,并且失败,读取无效输入,导致无限循环。

您可以使用kb.next()跳过无效输入:

while (true)
{
    try
    {
        choice = kb.nextInt();  
        if(choice >= 1 && choice <= 5) break;
    }
    catch (InputMismatchException e)
    {
        e.printStackTrace();
        kb.next();
    }
}

答案 5 :(得分:1)

if(choice >= 1 && choice <= 5)
    break;
else
    choice = 0;

答案 6 :(得分:1)

我认为最好使用Scanner.nextLine()Integer.parseInt()方法:

while(choice < 1 || choice > 5){
    try {
        choice = Integer.parseInt(kb.nextLine());  
    } catch (Exception e) { 
       //...print error msg
    }
}