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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:18:02