如何通过同一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
相关产品推荐
相关产品推荐

