为何调用含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
相关产品推荐
相关产品推荐

