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

Java读取键盘数据时抛出NoSuchElementException异常求助

解决Java Scanner读取数据时的NoSuchElementException问题

嘿,我看到你遇到的Scanner异常问题啦!咱们来一步步搞清楚原因和解决办法~

问题根源

你代码里的核心问题是重复创建并关闭Scanner对象:

  • 在readInteger()方法末尾调用了input.close(),这不仅会关闭Scanner本身,还会把它关联的底层输入流System.in也彻底关闭。
  • 当程序执行到readDouble()方法时,你又新建了一个Scanner试图读取System.in,但此时输入流已经被关闭,Scanner根本找不到可读取的内容,直接抛出NoSuchElementException。
  • 另外,每次读取都新建Scanner其实是没必要的操作,复用一个实例更合理。

解决办法

咱们只需要创建一个Scanner实例,在整个程序中复用它,最后在程序结束前统一关闭即可。可以通过把Scanner作为参数传递给读取方法来实现:

修改后的完整代码

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        // 只创建一个Scanner实例,全局复用
        Scanner input = new Scanner(System.in);
        Test r = new Test();
        System.out.println("Type a int number : " + r.readInteger(input));
        System.out.println("type a double number: " + r.readDouble(input));
        // 程序结束前统一关闭Scanner
        input.close();
    }

    public int readInteger(Scanner input) {
        int val = 0;
        while(true) {
            if(input.hasNextInt()) {
                val = input.nextInt();
                input.nextLine(); // 清除输入缓冲区的换行符
                break;
            } else {
                System.out.println("Invalid data type. Please enter an integer.");
                input.nextLine(); // 丢弃无效输入
            }
        }
        return val;
    }

    public double readDouble(Scanner input) {
        double val = 0;
        while(true) {
            if(input.hasNextDouble()) {
                val = input.nextDouble();
                input.nextLine(); // 清除输入缓冲区的换行符
                break;
            } else {
                System.out.println("Invalid data type. Please enter a double.");
                input.nextLine(); // 丢弃无效输入
            }
        }
        return val;
    }
}

改动说明

  • 把Scanner的创建移到main()方法中,作为全局复用的实例。
  • 两个读取方法改为接收Scanner参数,不再自己创建和关闭Scanner。
  • 优化了错误提示信息,让用户更清楚需要输入什么类型的数据。
  • 只在程序最后统一关闭Scanner,避免提前关闭System.in流。

测试运行示例

[roger@archroger ~]$ java Test
Type a int number : abc
Invalid data type. Please enter an integer.
123
Type a int number : 123
type a double number: xyz
Invalid data type. Please enter a double.
45.67
type a double number: 45.67

这样修改后,就能正常处理整数和浮点数的读取,也不会再出现异常啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:38:02