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

Java SE 8使用Scanner读取输入报NoSuchElementException问题排查

问题原因
  • 核心错误为重复实例化多个Scanner对象绑定同一个System.in输入流
  • Scanner读取输入时会将部分输入预加载到自身私有缓冲区,main方法中第一个Scanner读取测试用例数后,takeInput方法内新建的Scanner无法访问前一个Scanner已经缓存的输入数据,调用nextInt()时找不到有效输入就会抛出NoSuchElementException
修复方案

全局复用同一个Scanner实例即可,修改后代码如下:

import java.util.Scanner; // 原代码缺少导包语句,需补充否则会触发编译错误

public class Foo {
    // 全局复用同一个Scanner实例
    private static final Scanner SCANNER = new Scanner(System.in);

    public static int sum(int[] arr) {
        int ans = 0;
        for (int i = 0; i < arr.length; i++) {
            ans += arr[i];
        }
        return ans;
    }

    public static int[] takeInput() {
        int size = SCANNER.nextInt();
        int arr[] = new int[size];
        for (int i = 0; i < size; i++) {
            arr[i] = SCANNER.nextInt();
        }
        return arr;
    }

    public static void main(String[] args) {
        int testCases = SCANNER.nextInt();
        while (testCases-- > 0) {
            int arr[] = takeInput();
            System.out.println(sum(arr));
        }
        // 程序运行结束后再关闭Scanner
        SCANNER.close();
    }
}
补充注意点

不要在代码运行中途关闭Scanner,关闭Scanner会连带关闭底层绑定的System.in流,后续所有读取输入的操作都会直接失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 22:18:03