scanner抛异常,递归死循环导致StackOverflowError问题

scanner抛异常,递归死循环导致StackOverflowError问题

问题原因:导致scanner抛出的异常的数据没有被处理,一直存在缓冲区,递归下去,异常一直被截获,无限递归最终导致栈溢出。

public class Demo {
    static Scanner input = new Scanner(System.in);
    static int count=0;
    public static void main(String[] args) {
        int num = menu1();
        System.out.println("输入的是"+num);
    }
    public static int menu1(){
        System.out.println("输入0/1/2/3");
        Scanner input1 = new Scanner(System.in);//1.input1改成input或改下面
        int num = -1;
        try{
            num = input.nextInt();//1.input改成input1
            if (num<0 || num>3){
                return menu1();
            }
            return num;
        }catch (InputMismatchException e ){
            System.out.println("异常时输入的是");//2.括号里加input.next()接收数据
            System.out.println("捕获异常"+(++count));
            return menu1();
        }
    }
}

解决方法:如上代码,在menu1方法里再new一个对象或是在catch里用next()接收下来这个数据。
至于方法内scanner和外面static scanner对象引用指向及具体导致栈溢出过程,再研究下。
参考:
https://blog.csdn.net/weixin_51870711/article/details/110309884?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

在Maven项目中,如果你在测试类中使用了`java.util.Scanner`来获取用户输入并可能导致无限循环,通常是因为没有正确处理`Scanner`的关闭操作或者是循环条件设置有误。`Scanner`是一个用于读取控制台输入的类,如果循环没有设置合适的退出条件,例如检查输入是否为空或者达到某个特定值,那么就会形成死循环。 以下是可能导致死循环的一些常见情况: 1. **无限等待**:如果`Scanner.nextLine()`或类似方法没有正确判断输入,比如没有添加`break`语句,当程序期待用户输入结束标志(如`Ctrl+C`或特定字符串),可能会一直等待直到超时。 2. **循环条件错误**:没有设定退出循环的边界条件,使得循环无法正常终止。 3. **忘记关闭`Scanner`**:每次使用完`Scanner`后,应该调用`close()`方法释放资源,否则可能会阻塞,尤其是如果在循环外部创建了`Scanner`。 解决这个问题的关键在于确保循环有一个明确的退出条件,并在适当的时候关闭`Scanner`。例如,可以添加一个简单的条件判断,或者在读取到预期结束信号后关闭扫描器。同时,记住在完成所有对`Scanner`的操作后将其关闭,避免资源泄露。 ```java Scanner scanner = new Scanner(System.in); while (true) { String input = scanner.nextLine(); if (input.equals("exit")) { // 设置退出条件 break; } // 其他处理代码... } scanner.close(); // 确保关闭Scanner ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值