使用Scanner类处理用户输入时,当捕获到异常后,需要适当的清理输入流,以确保程序可以正确继续执行

问题描述

代码示例

public class Example {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (true){
            System.out.print("正常输入一个数字: ");
            int anInt = scanner.nextInt();//正常输入
            try {
                //错误输入的字符
                System.out.print("输入账号: ");
                int username = scanner.nextInt();
                System.out.print("输入密码: ");
                int passWorld = scanner.nextInt();
                System.out.println("账号: "+username+"密码: "+passWorld);
                break;
            } catch (Exception e) {
                System.out.println("非法输入,请重试");
            }

        }
    }
}

上面代码运行之后,错误输入字符之后。

产生原因

​ 用户输入非法字符串作为账号和密码时,会导致scanner.nextInt()方法抛出InputMismatchException异常。这个异常捕获后会进入到catch快中,输入提示。然后继续循环。

​ 由于异常没有处理,输入流中的非法字符串仍然存在,下一次循环时,scanner.nextInt()会尝试读取这个非法字符串,但由于它无法转换为整数,又会抛出相同的异常。

解决方案

  1. 在catch块中添加代码来清除输入流中的非法字符串,以确保下一次输入可以正常运行,在catch块中添加scanner.next()来读取并丢弃输入流中的非法字符串,使得下一次循环可以正常进行。

  2. 使用完scanner之后直接关闭close,使用的时候再创建,当然不推荐这种方式,资源开销大。

  3. 使用的Scanner里面的hasNextInt()方法替代nextInt()方法做判断。

posted @ 2024-08-01 14:38  Sixty-thousand-1039  阅读(84)  评论(0)    收藏  举报