1

我有以下方法

    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 -> 一切正常 用户类型:saddj -> 方法重新启动 -> 用户类型 3 -> 一切正常

有任何想法吗?

4

7 回答 7

2

改成:

do {

    // read choice value

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

} while(choice < 1 || choice > 5);
于 2012-11-23T16:14:34.267 回答
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();
}
于 2012-11-23T16:06:56.243 回答
1

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

while(choice < 1 || choice > 5){
    try {
        choice = kb.nextInt();  
    } catch (Exception e) { 
       //ignore the exception and continue
    }
}
于 2012-11-23T16:08:43.957 回答
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;
}
于 2012-11-23T16:10:24.927 回答
1

如果kb.NextInt()失败输入流中的数据仍然存在,则需要跳过它。如果您不跳过无效数据,则循环将不断尝试读取无效输入并失败,从而导致无限循环。

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

while (true)
{
    try
    {
        choice = kb.nextInt();  
        if(choice >= 1 && choice <= 5) break;
    }
    catch (InputMismatchException e)
    {
        e.printStackTrace();
        kb.next();
    }
}
于 2012-11-23T16:11:02.017 回答
1
if(choice >= 1 && choice <= 5)
    break;
else
    choice = 0;
于 2012-11-23T16:11:21.337 回答
1

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

while(choice < 1 || choice > 5){
    try {
        choice = Integer.parseInt(kb.nextLine());  
    } catch (Exception e) { 
       //...print error msg
    }
}
于 2012-11-23T16:17:14.790 回答