try-catch异常处理异常,递归引发StackOverflowError问题求助
问题分析与解决方案
问题根源
- Scanner缓冲区未清理:当输入非整数时,
scanner.nextInt()抛出InputMismatchException,但无效的输入内容仍留在Scanner的缓冲区中。后续每次调用nextInt()都会直接读取这个无效内容,再次触发异常,完全没有机会执行try块里的正常逻辑。 - 递归重试的风险:用递归实现输入重试,会不断在栈中压入新的方法调用,哪怕是因为缓冲区问题导致的无限重试,最终都会触发
StackOverflowError。
修复方案
- 把递归改成循环,避免栈溢出风险;
- 在catch块中调用
scanner.next(),清除缓冲区里的无效输入,让下次nextInt()能读取新的输入; - 精准捕获
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
相关产品推荐
相关产品推荐

