首頁 >Java >java教程 >為什麼帶有 InputMismatchException 的 Try-Catch 區塊會導致 Java 中的無限循環?

為什麼帶有 InputMismatchException 的 Try-Catch 區塊會導致 Java 中的無限循環?

Barbara Streisand
Barbara Streisand原創
2024-12-06 21:00:30304瀏覽

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);
    }
}

要理解為什麼會發生這種情況,檢查 Scanner 類別在遇到 InputMismatchException 時的行為至關重要。拋出異常後,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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn