6

ユーザー入力値をスキャンするコードを少し実行しようとしています。このアクションは、私が作成した getTriangleDim(); という名前のカスタム メソッドに含まれています。メソッドはユーザーの int 値を読み取り、それが特定の範囲内にあることを確認してから、入力された int 値を返します。この方法はうまく機能し、問題はありません。

getTriangleDim() メソッドに int 以外の値を入力すると、問題が発生します。InputMismatchException エラーが発生します。この問題を解決するために、do-while ループに try-catch ステートメントを記述しました。しかし、try-catch ステートメントを使用したのはこれが初めてで、何かが足りないようです。

do-while ループ内にネストされた try-catch ステートメントのコードを次に示します。

//loop to scan for triangle dimension
        boolean bError = true;
        int triangle;

        do{
            try {
                triangle = getTriangleDim();
                bError=false;
                }
            catch (Exception e){
                System.out.println("You did not enter an integer, please enter an integer value");
                triangle = getTriangleDim();

                }
        }while (bError);

int の代わりに char 値を入力してテストすると、実際にはエラーが 1 回検出され、"you did not....." ステートメントが出力されます。しかし、int 以外の別の数値を再入力すると、実行時エラーが再び表示されます........あなたはそれを推測しました........ InputMismatchException エラー。

私のメソッドのコードは次のとおりです。

//method for scanning triangle dimensions from keyboard
    public static int getTriangleDim(){
        int triangle = 0;
        Scanner keyboard = new Scanner(System.in);
        do{
        System.out.print("Enter a non-zero integer length (+/-1 - +/-16): ");
        triangle = keyboard.nextInt();
        if((!(triangle <= 16 && triangle >= 1))&&(!(triangle >= -16 && triangle <= -1)))
            System.out.println("Inpute value outside of range");
        }while((!(triangle <= 16 && triangle >= 1))&&(!(triangle >= -16 && triangle <= -1)));
        return triangle;
    }

続行するには Do-While ループが必要ですが、これらのエラーが発生し続けます。

4

1 に答える 1

1

catchブロックで入力を求める必要はありません。すでにループに入っているので、例外をキャッチし、ユーザーに有効な入力を行うように指示することができます。その後、他に何もする必要はありません。最初にループバックします。

do{
    try {
        triangle = getTriangleDim();
        bError=false;
    } catch (Exception e){
        System.out.println("You did not enter an integer, please enter an integer value");
        // Don't do anything else in here: we will loop back to the beginning again and get new input!
    }
}while (bError);

補足として (そしてお気付きのように)、そのブロックtriangleの外で使用しようとすると、コードは現在コンパイルされません。これは、コンパイラが実行時にプログラムが何をするかをコンパイル時に判断できないという事実によるものです。つまり、コンパイラはがそのループ内で常に初期化されることを認識できません。したがって、変数宣言もデフォルト値に設定する必要があります。の通常のデフォルトですが、プログラムで意味のあるものを使用してください(コードに基づいて問題ないように見えます)。try"triangle might not have been initialized"triangletriangle0int0getTriangleDim

int triangle = 0;
do { // etc.

このようにして、ループを終了するまでに値を持つコンパイラーを「約束」することtriangleができ、それを他の場所で使用できるようになります。

于 2014-02-25T04:56:23.853 に答える