27

だから私はユーザー入力からintを取るプログラムを構築しています。ユーザーが int を入力しない場合、入力するまでブロックを繰り返す必要がある、非常に単純な try/catch ブロックのように見えるものがあります。コードの関連部分は次のとおりです。

import java.util.InputMismatchException;
import java.util.Scanner;


public class Except {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        boolean bError = true;
        int n1 = 0, n2 = 0, nQuotient = 0;

        do {
            try {
                System.out.println("Enter first num: ");
                n1 = input.nextInt();
                System.out.println("Enter second num: ");
                n2 = input.nextInt();
                nQuotient = n1/n2;
                bError = false;
            } 
            catch (Exception e) {
                System.out.println("Error!");
            }
        } while (bError);

        System.out.printf("%d/%d = %d",n1,n2, nQuotient);
    }
}

2 番目の整数に 0 を入力すると、try/catch は本来の動作を正確に実行し、再度入力させます。しかし、数値の 1 つに 5.5 を入力するなどして InputMismatchException が発生した場合、無限ループでエラー メッセージが表示されるだけです。なぜこれが起こっているのですか?どうすればよいですか? (ちなみに、キャッチする引数にInputMismatchExceptionを明示的に打ってみましたが、直りませんでした。

4

7 に答える 7

35

next();エラーが発生したときに呼び出す必要があります。また、使用することをお勧めしますhasNextInt()

       catch (Exception e) {
            System.out.println("Error!");
           input.next();// Move to next other wise exception
        }

整数値を読み取る前に、スキャナーに整数値があることを確認する必要があります。そして、そのような例外処理は必要ありません。

    Scanner scanner = new Scanner(System.in);
    int n1 = 0, n2 = 0;
    boolean bError = true;
    while (bError) {
        if (scanner.hasNextInt())
            n1 = scanner.nextInt();
        else {
            scanner.next();
            continue;
        }
        if (scanner.hasNextInt())
            n2 = scanner.nextInt();
        else {
            scanner.next();
            continue;
        }
        bError = false;
    }
    System.out.println(n1);
    System.out.println(n2);

スキャナの Javadoc

スキャナーが InputMismatchException をスローすると、スキャナーは例外の原因となったトークンを渡さないため、他の方法でトークンを取得またはスキップできます。

于 2012-10-03T04:52:58.353 に答える
4

次のことも試すことができます

   do {
        try {
            System.out.println("Enter first num: ");
            n1 = Integer.parseInt(input.next());

            System.out.println("Enter second num: ");
            n2 = Integer.parseInt(input.next());

            nQuotient = n1/n2;

            bError = false;
        } 
        catch (Exception e) {
            System.out.println("Error!");
            input.reset();
        }
    } while (bError);
于 2012-10-03T05:09:18.260 に答える
1

bError = falseステートメントに到達することはなく、受け取った入力にtry blockステートメントがヒットするため、無限ループでエラーを出力し続けます。

を使用して、このように使用してみてくださいhasNextInt()

catch (Exception e) {
            System.out.println("Error!");
           input.hasNextInt();         
        }

または、入力を取得nextLine()するために と組み合わせて使用​​してみてくださいInteger.parseInt()....

Scanner scan = new Scanner(System.in);

int num1 = Integer.parseInt(scan.nextLine());
int num2 = Integer.parseInt(scan.nextLine());
于 2012-10-03T05:02:08.760 に答える
1

AmitDの回答を補足するには:

プログラムをコピーして貼り付けるだけで、次の出力が得られました。

Error!
Enter first num: 
.... infinite times ....

ご覧のとおり、命令:

n1 = input.nextInt();

倍数が入力されたときに継続的に例外をスローしています。これは、ストリームがクリアされていないためです。それを修正するには、AmitD の回答に従ってください。

于 2012-10-03T05:03:37.783 に答える
1

@Limp、あなたの答えは正しいです。入力の読み取り中に . nextLine() を使用してください。サンプルコード:

    do {
        try {
            System.out.println("Enter first num: ");
            n1 = Integer.parseInt(input.nextLine());
            System.out.println("Enter second num: ");
            n2 = Integer.parseInt(input.nextLine());
            nQuotient = n1 / n2;
            bError = false;
        } catch (Exception e) {
            System.out.println("Error!");
        }
    } while (bError);

    System.out.printf("%d/%d = %d", n1, n2, nQuotient);

以下のリンクで、この問題が発生した理由の説明をお読みください。このスレッドの詳細について投稿した回答を探してください。 Java Homework ユーザー入力の問題

わかりました、簡単に説明します。nextInt() を使用して入力を読み取ると、数値部分だけが読み取られますが、ENDLINE 文字はまだストリーム上にありました。それが主な原因でした。上記のコードを見てください。行全体を読み取って解析しただけですが、それでも例外がスローされ、期待どおりに動作します。コードの残りの部分は正常に動作します。

于 2012-10-03T05:04:28.777 に答える