带有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中文网其他相关文章!