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
相关产品推荐
相关产品推荐

