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
相关产品推荐
相关产品推荐

