trycatch中使用Scanner.nextInt()死循环的问题

本文解析了Java中如何避免因InputMismatchException导致的Scanner无限循环,重点讲解了为何不处理异常会导致循环和使用新Scanner对象清空缓冲区的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.exception_;

import java.util.InputMismatchException;
import java.util.Scanner;


public class InputInteger {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int num = 0;

        while (true) {
            try {
                System.out.print("输入一个整数:");
                //若抛出异常,则在执行该语句后直接进入catch,接下来的语句不会执行
                num = scanner.nextInt();
                //如果运行无异常,则执行break
                break;
            } catch (Exception e) {
                System.out.println("输入的不是整数,请重新输入!");
                scanner = new Scanner(System.in);
            }
        }

        System.out.println("输入的整数为" + num);
    }
}

上面代码catch中的num=Scanner.nextInt() 如果不写,会导致该段代码陷入无限循环:

这是csdn的主流解释,但总感觉有点模糊 https://blog.csdn.net/m304964781/article/details/48376511?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.pc_relevant_paycolumn_v3&spm=1001.2101.3001.4242.1&utm_relevant_index=3icon-default.png?t=M276https://blog.csdn.net/m304964781/article/details/48376511?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.pc_relevant_paycolumn_v3&spm=1001.2101.3001.4242.1&utm_relevant_index=3

查阅相关资料后,陷入死循环的大概原因如下:

当输入非整型数时,系统会抛出 InputMismatchException 异常时不会清除键盘缓冲区中的字符串,因此循环调用nextInt()时,仍然能够读取到上次输入的字符串,导致陷入死循环,使用新对象,会"清空"缓冲? 而使用next() + Integer.parseInt() 则不会产生此问题。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值