0

*編集:try catchエラーを修正した後、catch {..印刷時に問題が発生しました。*、基本的に、もう一度プレイしたいと言うと、ゲームはそのまま続行されますが、最初のものも出力catchされ、23 行目で入力が求められます。

if (decision.equalsIgnoreCase("yes"))
        {
            ai = (int)(Math.random()*101);
            System.out.println("From 0 to 100, what number do you think I have generated?");

            tryCatch = true;
            loop = true;
            rtrn = true;

            while (tryCatch == true)    
            {   
                while (loop == true)
                {
                    try
                    {
                        guess = Integer.parseInt(iConsole.nextLine());
                        if (guess >= 0)
                        {
                            loop = false;
                        }
                    }

                    catch (NumberFormatException e)
                    {
                        System.out.println("Invalid input. Please try again.");
                    }

                    catch (InputMismatchException e)
                    {
                        System.out.println("Invalid input. Please try again!");
                    }
                }

こんにちは、これは私の最初の投稿です。フォーラムでコードの書式設定が間違っていたら、編集します。

現在、CPUが数値を生成し、ユーザーがそれを推測する必要があるJava Eclipseでゲームをコーディングしています。私はこれのほとんどにスキャナークラスを使用しています。私が問題を抱えているのは、ユーザー入力が有効な整数であるかどうかを確認するために try catch を作成することです。

最終的に何が起こるかというと、その下のコード ブロックが既に初期化されている変数を認識しないということです。

package ics3U;

import java.util.*;
import java.io.*;

public class highLow
{
    static public void main (String args[]) throws IOException
    {
        String name;
        String decision;
        String decision2;
        int ai;
        int guess;
        int counter = 1;
        boolean fullGame = true;
        boolean tryCatch = true;
        boolean rtrn = true;

        Scanner iConsole = new Scanner(System.in);

        System.out.println("Hello! Welcome to HiLo!");
        System.out.println("What is your full name?");

        name = iConsole.nextLine();

        System.out.println("Hello " + name + "! Would you like to play?");
        decision = iConsole.nextLine();

        while (fullGame == true)
        {
            if (decision.equalsIgnoreCase("yes"))
            {
                ai = (int)(Math.random()*101);
                System.out.println("From 0 to 100, what number do you think I have generated?");

                tryCatch = true;
                rtrn = true;

                while (tryCatch == true)    
                {   
                    try
                    {
                        guess = Integer.parseInt(iConsole.nextLine());
                    }

                    catch (Exception e)
                    {
                        System.out.println("Invalid input. Please try again.");
                    }

                    while (guess != ai)
                    {
                        if (guess < ai)
                        {
                            System.out.println("Too low!");
                            guess = iConsole.nextInt();
                        }

                        else if (guess > ai)
                        {
                            System.out.println("Too high!");
                            guess = iConsole.nextInt();
                        }
                        counter = counter + 1;
                    }
                    System.out.println("Correct! You guessed it after " + counter + " tries!");
                    counter = ((counter - counter)+1);
                    System.out.println("Would you like to play again?");

                    while (rtrn == true)
                    {
                        decision2 = iConsole.next(); //finally..

                        if (decision2.equalsIgnoreCase("yes"))
                        {
                            fullGame = true;
                            tryCatch = false;
                            rtrn = false;
                            break; //do-while may be needed, have to bypass catch, 'break' works after restating value of tryCatch & rtrn
                        }

                        else if (decision2.equalsIgnoreCase("no"))
                        {
                            System.out.println("Goodbye.");
                            fullGame = false;
                            tryCatch = false;
                            rtrn = false;
                            iConsole.close();
                        }

                        else
                        {
                            System.out.println("Sorry?");
                        }
                    }

                    /*catch (Exception e)
                    {
                        System.out.println("Invalid input. Please try again.");
                    }

                    catch (NumberFormatException e)
                    {
                        System.out.println("Invalid input. Please try again.");
                    }
                    //More specific Exceptions, turn this on later              
                    catch (InputMismatchException e)
                    {
                        System.out.println("Invalid input. Please try again!");
                    }*/
                }
            }

            else if (decision.equalsIgnoreCase("no"))
            {
                System.out.println("Goodbye.");
                fullGame = false;
                tryCatch = false;
                rtrn = false;
                iConsole.close();
            }

            else
            {
                System.out.println("Sorry?");
                decision = iConsole.nextLine();
            }
        }
    }
}
4

3 に答える 3

1

continuecatch ブロックにステートメントを追加します。そうすれば、ユーザーが整数ではない何かを入力して解析が失敗した場合、残りのループを実行しようとするのではなく、すぐに再試行します。

try
{
    guess = Integer.parseInt(iConsole.nextLine());
}
catch (Exception e)
{
    System.out.println("Invalid input. Please try again.");
    continue; // jump to beginning of loop
}
于 2012-10-03T15:08:34.673 に答える
0

ステートメントは try ブロックにあるため、失敗する可能性があり、プログラムは初期化されていない変数を使用しようとする可能性があります。解決策は、変数を意味のあるデフォルト値に初期化することです。

int guess = -1; // some default value 

また、try/catch ブロックの周りに while ループをラップする必要があります。入力データが有効になるまでプログラムを進行させないでください。

boolean validGuess = false;
while (!validGuess) {
  // prompt user for input here
  try {
    guess = Integer.parseInt(iConsole.nextLine());
    if (/* .... test if guess is valid int */ ) {
      validGuess = true;
    } 
  } catch (NumberFormatException e) {
      // notify user of bad input, that he should try again
  }
}

プログラム全体で同様のことを行う必要がある場合は、これらすべてを独自のメソッドにカプセル化することもできます。

于 2012-10-03T15:05:04.520 に答える
0

この行の後の try ブロック内の (ループ内の) catch ブロックの後にすべてのコードを移動してみてください

guess = Integer.parseInt(iConsole.nextLine());

あなたが現在持っているように、parseInt に例外があるときはいつでも、ループを再開する代わりに、割り当てられていない推測を処理しようとします。

于 2012-10-03T15:09:29.697 に答える