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

Java中Scanner.hasNextInt()二次调用不等待输入报NoSuchElementException问题

Java Scanner二次调用读取输入失败问题修复

错误根因

问题核心来自方法末尾的sc.close()调用:

  • Scanner执行close()时会连带关闭底层绑定的输入流,此处绑定的是JVM全局唯一的System.in标准输入流
  • 第一次方法调用结束后System.in被永久关闭,第二次调用时即便重新实例化Scanner,也无法从已关闭的流中读取内容,hasNextInt()会直接返回false,调用next()就会抛出NoSuchElementException异常

修复方案

方案1:全局复用Scanner实例(推荐)

全局仅实例化一次Scanner,不要在业务方法内执行关闭操作,程序完全退出前再统一关闭:

// 类全局静态Scanner,仅初始化一次
private static final Scanner GLOBAL_SCANNER = new Scanner(System.in);

public static int getInput() {
    int input;
    do {
        System.out.println("Please enter a number [0-200]!");
        while (!GLOBAL_SCANNER.hasNextInt()) {
            System.out.println("That's not a number!");
            GLOBAL_SCANNER.next();
        }
        input = GLOBAL_SCANNER.nextInt();
    } while (input < 0 || input > 200);
    return input;
}

// 整个程序所有输入逻辑都执行完毕后,再调用GLOBAL_SCANNER.close()释放资源

方案2:轻量修改

如果不想调整原有代码结构,直接删除方法末尾的sc.close()调用即可。System.in会在JVM进程退出时自动回收,不会产生资源泄漏问题。

额外逻辑修正

原有代码的循环条件写反,若需求是获取[0,200]区间的合法整数,需要将do-while的判断条件修改为:

} while (input < 0 || input > 200);

原逻辑下输入合法区间的数值会触发循环要求重新输入,仅输入区间外的数值才会返回,和预期功能不符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:06:03