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

Scanner对象引发while(true)循环无限迭代问题求助

解决while(true)循环中使用Scanner的无限迭代问题

问题本质

关闭Scanner对象时,会连带关闭它关联的底层输入流System.in——而System.in是全局唯一的,一旦关闭就无法重新打开。之后所有针对该输入流的读取操作都会直接返回“无输入”,导致hasNextInt()等方法持续返回false,触发循环无限迭代。

常规解决方法

  • 复用同一个Scanner实例
    这是标准且推荐的做法:在循环外部创建Scanner对象,全程复用它(可以作为参数传入方法,或者设为类成员变量),直到程序结束前都不要关闭它。程序终止时JVM会自动回收相关资源,无需手动关闭。你当前的临时写法其实就是这种常规方案,完全符合要求,不需要修改while(true)的循环条件。

  • 绝对禁止在循环/方法内重复创建并关闭Scanner
    每次在方法里new Scanner(System.in)后调用close(),都会直接废掉全局的System.in流,后续所有输入操作都会失效,必然引发无限循环。

  • 务必消费无效输入
    当输入既不是整数也不是退出指令q时,必须调用userInput.next()把无效的输入内容消费掉——否则Scanner会一直停留在这个无效输入上,下一次循环依然读取到相同的无效内容,同样会导致无限循环。你代码里已经做了这一步,这是避免问题的关键细节。

对当前代码的确认

你现在的代码写法已经是正确的常规解决方案:循环外创建Scanner并传入方法,不关闭它,同时正确处理了无效输入的消费,完全可以保持while(true)的循环条件正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 12:17:43