You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

try-catch异常处理异常,递归引发StackOverflowError问题求助

问题分析与解决方案

问题根源

  • Scanner缓冲区未清理:当输入非整数时,scanner.nextInt()抛出InputMismatchException,但无效的输入内容仍留在Scanner的缓冲区中。后续每次调用nextInt()都会直接读取这个无效内容,再次触发异常,完全没有机会执行try块里的正常逻辑。
  • 递归重试的风险:用递归实现输入重试,会不断在栈中压入新的方法调用,哪怕是因为缓冲区问题导致的无限重试,最终都会触发StackOverflowError。

修复方案

  1. 把递归改成循环,避免栈溢出风险;
  2. 在catch块中调用scanner.next(),清除缓冲区里的无效输入,让下次nextInt()能读取新的输入;
  3. 精准捕获InputMismatchException,而非泛用的Exception,提升代码健壮性。

修改后的代码:

package object.myobject;

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

public class CatchTheException {
    Scanner scanner = new Scanner(System.in);

    void receiveInt() {
        System.out.println("请输入一个整数");
        while (true) {
            try {
                int num = scanner.nextInt();
                System.out.println("你输入的整数是:" + num);
                System.out.println("try块执行成功");
                break; // 输入正确,退出循环
            } catch (InputMismatchException e) {
                System.out.println("输入错误:请输入整数类型");
                scanner.next(); // 消费缓冲区里的无效输入
            }
        }
        scanner.close(); // 使用完毕关闭Scanner
    }

    public static void main(String[] args) {
        new CatchTheException().receiveInt();
    }
}

关键说明

  • scanner.next():在catch块中调用该方法,可将缓冲区里的无效字符串(如字母、符号)读取并丢弃,确保下次nextInt()能等待新的用户输入,而非重复读取无效内容。
  • 循环替代递归:循环不会像递归那样持续占用栈空间,即便多次重试也不会出现栈溢出问题。
  • 精准捕获异常:使用InputMismatchException代替Exception,避免捕获到Scanner关闭等无关异常,让代码逻辑更清晰。

内容的提问来源于stack exchange,提问作者CodeNewbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 13:47:18