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

如何通过同一Scanner方法获取多个输入值?求助解决调用报错问题

解决Scanner调用两次报错NoSuchElementException的问题

嘿,我太懂你遇到的这个坑了!咱们先拆解下问题根源:

你的getInput方法每次调用都会新建一个Scanner实例,然后立马调用number.close()。这里的关键bug是——Scanner关闭时会连带关闭它绑定的System.in输入流,而System.in是全局唯一的控制台输入流,一旦被关闭,整个程序就再也没法从控制台读取输入了。第一次调用getInput后,System.in已经被关掉,第二次调用时新建的Scanner自然读不到任何内容,直接抛出NoSuchElementException。

靠谱的解决方案

这里给你两种常用的修复方式,选哪种都能解决问题:

方案1:在main中创建一次Scanner,传递给方法使用

把Scanner的创建和统一关闭放在main方法里,getInput只负责读取输入逻辑,避免重复关闭流:

import java.util.Scanner;

public class Statistic { // 提醒下Java类名规范,首字母要大写哦
    public static int getInput(Scanner scanner) {
        System.out.print("Integer value: ");
        return scanner.nextInt();
    }

    public static void main(String[] args) {
        Scanner number = new Scanner(System.in);
        int a = Statistic.getInput(number);
        int b = Statistic.getInput(number);
        
        // 这里可以添加你的业务逻辑,比如计算统计值等操作
        
        number.close(); // 所有输入操作完成后再统一关闭
    }
}

方案2:使用静态Scanner实例

让整个类共用一个静态的Scanner实例,全程只创建和关闭一次:

import java.util.Scanner;

public class Statistic {
    // 静态Scanner,整个类共用
    private static Scanner scanner = new Scanner(System.in);

    public static int getInput() {
        System.out.print("Integer value: ");
        return scanner.nextInt();
    }

    public static void main(String[] args) {
        int a = Statistic.getInput();
        int b = Statistic.getInput();
        
        // 业务逻辑处理
        
        scanner.close(); // 最后统一关闭即可
    }
}

额外小提示

  • 永远不要在单次读取输入的方法里关闭Scanner(除非你确定整个程序再也不需要读取输入了)
  • 遵循Java命名规范,类名首字母大写、方法名小驼峰,能让你的代码可读性提升不少

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:02:47