You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

自学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()的地方。你可以按照下面的步骤修复:

  1. 避免重复关闭或创建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();
        }
    }
    
  2. 调用next()前先判断输入是否存在
    在使用next()nextInt()等方法前,先调用hasNext()hasNextInt()来检查输入流中是否有对应的元素,这样就能避免异常抛出。

  3. 检查IDE的输入配置
    如果是在IDE(比如IntelliJ IDEA、Eclipse)中运行程序,确保你在运行配置里开启了控制台输入的支持,运行时能正常在控制台输入内容。

内容的提问来源于stack exchange,提问作者Kartik Daiya

火山引擎 最新活动