ホームページ > Java > &#&チュートリアル > InputMismatchException を伴う Try-Catch ブロックが Java で無限ループを引き起こすのはなぜですか?

InputMismatchException を伴う Try-Catch ブロックが Java で無限ループを引き起こすのはなぜですか?

Barbara Streisand
リリース: 2024-12-06 21:00:30
オリジナル
277 人が閲覧しました

Why Does a Try-Catch Block with InputMismatchException Cause an Infinite Loop in Java?

無限ループを引き起こす InputMismatchException を伴う try/catch ブロック

ユーザーからの整数入力を受け入れるように設計された Java プログラムでは、try/catchブロックは無効な入力を処理するために使用されます。ただし、以下のコードでは、ユーザーが非整数値、特に InputMismatchException を入力すると、無限ループが発生します。

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);
    }
}
ログイン後にコピー

これが発生する理由を理解するには、InputMismatchException が発生したときの Scanner クラスの動作を調べることが重要です。 。例外をスローした後、Scanner は無効な入力を破棄しません。代わりに、入力ストリームに残り、try/catch ブロック内で無限ループが発生する可能性があります。

解決策は、catch ブロック内で input.next() を明示的に呼び出して無効なトークンを破棄することです。さらに、入力を受け入れる前に hasNextInt() を使用して、有効な整数が利用可能かどうかを確認することをお勧めします。

以下の修正されたコードは、次の推奨事項に従っています。

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 (InputMismatchException e) {
                System.out.println("Error!");
                input.next(); // Discard the invalid token
            }
        } while (bError);

        System.out.printf("%d/%d = %d", n1, n2, nQuotient);
    }
}
ログイン後にコピー

これらの変更を組み込むことにより、 try/catch ブロックは、InputMismatchException を効果的に処理し、ユーザーが無効な入力を入力したときにプログラムが無限ループに入らないようにします。

以上がInputMismatchException を伴う Try-Catch ブロックが Java で無限ループを引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート