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

为何调用含Scanner的类方法时会抛出java.util.NoSuchElementException?

嘿,我来帮你搞定这个问题!你遇到的NoSuchElementException其实是多个Scanner抢同一个输入流搞出来的麻烦,我给你拆解清楚,再给你符合要求的解决方案:

问题到底出在哪?

你在main里创建了一个Scanner读取测试用例数,然后每次调用computeReminder()时又新建一个Scanner读取输入——这就相当于两个工具同时抢同一个水管里的水,肯定会乱套。

具体来说,第一个Scanner会提前把一部分输入数据读到自己的缓冲区里,后面新建的Scanner再去读的时候,流里的有效数据已经被第一个Scanner占了,哪怕你明明输入了足够的内容,第二个Scanner也拿不到需要的数字,最后就抛出NoSuchElementException了。

符合要求的解决方案(computeReminder必须无参数)

核心思路就是整个程序只用一个Scanner实例,不能重复创建。这里给你两种简单可行的方式:

方式1:把Scanner做成Reminder的静态成员

直接在Reminder类里定义一个静态的Scanner,让所有方法共用它,这样就不会有流冲突了:

import java.util.Scanner;

class Reminder{
    // 全局共用的静态Scanner,只初始化一次
    private static Scanner inputScanner = new Scanner(System.in);
    
    static void computeReminder(){
        int a, b;
        a = inputScanner.nextInt();
        b = inputScanner.nextInt();
        int reminder = a % b;
        System.out.println(reminder);
    }
}

class TestClass{
    public static void main(String args[]){
        Scanner scan = new Scanner(System.in);
        int T = scan.nextInt();
        // 关闭main里的Scanner,避免占用输入流
        scan.close();
        
        for(int i=0; i<T; i++){
            Reminder.computeReminder();
        }
    }
}

如果你想更简洁,连main里的Scanner都可以省掉,直接用Reminder的静态Scanner:

import java.util.Scanner;

class Reminder{
    private static Scanner inputScanner = new Scanner(System.in);
    
    static void computeReminder(){
        int a, b;
        a = inputScanner.nextInt();
        b = inputScanner.nextInt();
        int reminder = a % b;
        System.out.println(reminder);
    }
    
    // 新增静态方法获取测试用例数
    static int getTestCount(){
        return inputScanner.nextInt();
    }
}

class TestClass{
    public static void main(String args[]){
        int T = Reminder.getTestCount();
        for(int i=0; i<T; i++){
            Reminder.computeReminder();
        }
    }
}

方式2:用单例模式封装Scanner(进阶版)

如果想代码更规范,可以把Scanner封装成单例,确保全局只有一个实例,但对于学校作业来说,方式1已经完全够用啦。

测试你的输入

你的输入5 19 5 73 4 7 3 18 4 68 2是完全没问题的:

  • 第一个数字5是测试用例数
  • 后面每两个数字一组对应一次计算,修改后的代码会输出:4、1、1、2、0,完全符合预期。

内容的提问来源于stack exchange,提问作者Gautham Ramesh Babu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:51:29