Java使用scan.hasNext()、nextInt()循环时Scanner不关闭问题
Java Scanner读取控制台输入后程序不退出的解决方案
问题原因
- 核心原因是
System.in作为控制台标准输入流是阻塞流,Scanner.hasNext()方法在流未收到结束标记(EOF)时会持续等待新输入,即便已读完当前所有输入内容,也不会返回false,因此循环不会终止,程序一直处于运行状态。 - 冗余配置问题:你设置的
scan.useDelimiter("\\s*")是不必要的,Scanner默认的分隔符规则就会匹配任意数量的空白符(空格、换行、制表符等),该配置反而可能因为匹配到0长度空白符引发额外解析异常。
解决方案
方案1:手动输入EOF标记
输完所有内容后,按下对应快捷键给控制台发送EOF信号即可让hasNext()返回false,程序自动退出:
- Windows系统:按
Ctrl + Z - Linux/macOS系统:按
Ctrl + D
方案2:按输入长度固定次数循环(更推荐)
你的输入第一行明确标注了后续数据组数为4,完全可以先读取组数,再按固定次数循环读取内容,避免无限等待:
Scanner scan = new Scanner(System.in); // 先读取第一行的总组数 int groupCount = scan.nextInt(); for (int i = 0; i < groupCount; i++) { int num1 = scan.nextInt(); int num2 = scan.nextInt(); System.out.print(num1 + "" + num2); } // 读取完成后关闭Scanner scan.close();
该方案不需要用户额外操作,读完约定数量的内容就会自动终止,完美适配你的输入场景。
方案3:主动关闭输入流(不推荐)
如果确定后续不需要再使用标准输入,可以在读完内容后调用System.in.close()直接关闭流,强制终止Scanner的等待逻辑,但该操作会导致后续所有读取标准输入的逻辑失效,非特殊场景不建议使用。
内容的提问来源于stack exchange,提问作者squirrelonfire
相关产品推荐
相关产品推荐

