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 -> すべて OK ユーザー タイプ: saddj -> メソッドの再起動 -> ユーザー タイプ 3 --> すべて OK

何か案は?

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を入力すると、choiceはその値を取り、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

Scanner.nextLine()andメソッドを使用する方が良いと思いますInteger.parseInt()

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

この方法は実際にはうまくいきます:

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 に答える