Java程序调用.nextInt()时抛出NoSuchElementException问题求助
解决Scanner调用.nextInt()抛出NoSuchElementException的问题
问题根源
NoSuchElementException出现的核心原因是:Scanner尝试读取整数,但输入流已经耗尽、没有可用元素,或者读取位置错位导致找不到预期的整数。结合你的报错行和输入文件内容,大概率是这几个情况:
- 某个方法(比如
findAcct或withdrawal)提前关闭了共享的inputFileScanner,流关闭后再调用nextInt()必然报错; - 读取时没做判断,文件内容读完后仍强行调用
nextInt(); - 混合使用
nextInt()和nextLine()导致读取位置错位,后续找不到整数元素。
具体修复方案
1. 禁止在子方法中关闭Scanner
所有接收inputFile作为参数的方法(findAcct、withdrawal等),绝对不能调用inputFile.close()。Scanner关闭会连带关闭底层输入流,后续任何读取操作都会失败。统一在所有读取逻辑完成后,在主方法里关闭Scanner。
2. 读取前先判断是否有可用元素
在调用nextInt()前,必须用hasNextInt()做检查,避免流耗尽时强行读取。比如把第24行的代码改成:
if (inputFile.hasNextInt()) { account = inputFile.nextInt(); } else { // 这里可以加终止逻辑,比如break退出循环,或者输出日志提示 break; }
3. 处理nextInt()和nextLine()的混合使用问题
如果代码里同时用了nextInt()和nextLine(),注意nextInt()不会读取换行符,后续nextLine()会读取空行导致错位。解决办法是在nextInt()之后调用一次nextLine()消费掉换行符:
account = inputFile.nextInt(); inputFile.nextLine(); // 吃掉换行符,避免影响后续读取
4. 检查子方法对Scanner读取位置的影响
第40行调用findAcct时传入了inputFile,要确认这个方法内部没有过度读取元素。比如findAcct如果在内部循环读取了多个整数,会导致主流程的读取位置偏离预期,甚至直接耗尽输入流。
规范输入文件的读取逻辑
你的输入文件每行是账号(int) 余额(double)的格式,正确的循环读取方式应该是:
while (inputFile.hasNextInt()) { int account = inputFile.nextInt(); double balance = inputFile.nextDouble(); // 处理账号和余额的逻辑,比如存入数组或集合 }
这种方式能严格对应输入文件的结构,避免读取错位。
内容的提问来源于stack exchange,提问作者catdu
相关产品推荐
相关产品推荐

