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

Java程序调用.nextInt()时抛出NoSuchElementException问题求助

解决Scanner调用.nextInt()抛出NoSuchElementException的问题

问题根源

NoSuchElementException出现的核心原因是:Scanner尝试读取整数,但输入流已经耗尽、没有可用元素,或者读取位置错位导致找不到预期的整数。结合你的报错行和输入文件内容,大概率是这几个情况:

  • 某个方法(比如findAcct或withdrawal)提前关闭了共享的inputFile Scanner,流关闭后再调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:58:28