帶有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中文網其他相關文章!