自学Java使用Scanner遇java.util.NoSuchElementException错误求助
解决Java标准I/O中的
NoSuchElementException问题 嘿,我看到你自学Java时在标准I/O部分碰到了这个头疼的异常,咱们来拆解一下问题,找到解决办法~
你遇到的错误信息
Exception in thread "main" Enter first name : java.util.NoSuchElementException at java.util.Scanner.throwFor(Scanner.java:862) at java.util.Scanner.next(Scanner.java:1371) at FirstJavaHello.ex_2_3(FirstJavaHello.java:46) at FirstJavaHello.main(FirstJavaHello.java:67)
问题原因分析
这个NoSuchElementException通常是因为你的Scanner对象调用next()方法时,输入流里已经没有可读取的元素了。常见的触发场景有这几种:
- 你在代码的其他地方提前调用了
Scanner.close(),这会连带关闭底层的System.in输入流,后续再用Scanner读取就会失败; - 程序期望用户输入内容,但实际运行时没有提供任何输入(比如在某些IDE环境中没有正确配置输入,或者脚本运行时没有传入输入);
- 多次创建
Scanner实例来读取System.in,导致流的状态混乱。
结合你的代码给出修复建议
从你提供的代码片段来看,问题出在ex_2_3方法的第46行调用Scanner.next()的地方。你可以按照下面的步骤修复:
避免重复关闭或创建Scanner
尽量在整个程序中复用同一个Scanner实例,不要在使用完某个功能后就关闭它,直到整个程序不再需要读取输入时再关闭。比如:import java.util.Scanner; public class FirstJavaHello { // 全局复用一个Scanner实例 private static Scanner scanner = new Scanner(System.in); public static void ex_2_3() { System.out.print("Enter first name : "); // 先判断是否有输入可用,再调用next() if(scanner.hasNext()){ String firstName = scanner.next(); // 处理你的业务逻辑 System.out.println("Hello, " + firstName); } else { System.out.println("没有获取到输入内容"); } } public static void main(String[] args) { ex_2_3(); // 程序结束前再关闭Scanner scanner.close(); } }调用next()前先判断输入是否存在
在使用next()、nextInt()等方法前,先调用hasNext()、hasNextInt()来检查输入流中是否有对应的元素,这样就能避免异常抛出。检查IDE的输入配置
如果是在IDE(比如IntelliJ IDEA、Eclipse)中运行程序,确保你在运行配置里开启了控制台输入的支持,运行时能正常在控制台输入内容。
内容的提问来源于stack exchange,提问作者Kartik Daiya




