首页 > Java > java教程 > 为什么带有 InputMismatchException 的 Try-Catch 块会导致 Java 中的无限循环?

为什么带有 InputMismatchException 的 Try-Catch 块会导致 Java 中的无限循环?

Barbara Streisand
发布: 2024-12-06 21:00:30
原创
276 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板