Java读取文本文件计算最大值遇NoSuchElementException,求代码排查
问题排查与修复方案
核心问题1:重复调用nextInt()引发的异常
你的代码在while循环里,每次判断inputStream.nextInt() > max、更新max、更新sum时都调用了nextInt()——每次调用这个方法都会让Scanner读取文件里的下一个整数。比如文件里只有1个整数,第一次循环hasNextInt()返回true,执行inputStream.nextInt()读取这个数后,接下来的max = inputStream.nextInt()就找不到下一个整数了,直接抛出NoSuchElementException。
正确的做法是:每次循环只调用一次nextInt(),把读取到的整数存到一个变量里,之后的判断、计算都用这个变量。
核心问题2:sum的赋值逻辑错误
代码里sum = +inputStream.nextInt()是把sum直接设置为当前读取的整数,不是累加。应该改成sum += currentNum(等价于sum = sum + currentNum)。
核心问题3:max/min初始化不合理
你现在把max和min初始化为0,如果文件里的整数全是负数,max会一直停在0,结果完全错误。应该先读取第一个整数,用它来初始化max、min和sum,再处理剩下的数。
修复后的完整代码
import java.io.*; import java.util.Scanner; public class Main { public static void main(String[] args) { String fileName = "scratch.txt"; Scanner inputStream = null; try { inputStream = new Scanner(new File(fileName)); } catch (FileNotFoundException exception) { System.out.println("未找到文件: " + fileName + ",程序退出。"); System.exit(0); } int sum = 0; int count = 0; int max; int min; // 先读取第一个整数初始化变量 if (inputStream.hasNextInt()) { int currentNum = inputStream.nextInt(); sum = currentNum; max = currentNum; min = currentNum; count = 1; } else { System.out.println("文件中没有整数。"); inputStream.close(); return; } // 处理剩下的整数 while (inputStream.hasNextInt()) { int currentNum = inputStream.nextInt(); sum += currentNum; count++; // 更新最大值 if (currentNum > max) { max = currentNum; } // 更新最小值 if (currentNum < min) { min = currentNum; } } System.out.println("最大值: " + max); System.out.println("最小值: " + min); System.out.println("整数平均值: " + (double) sum / count); // 转成double避免整数除法截断 inputStream.close(); } }
额外优化说明
- 把变量
i改名为count,语义更清晰; - 计算平均值时强制转成
double,避免整数除法导致的精度丢失(比如sum=5、count=2时,整数除法会得到2,转成double后得到2.5); - 增加了文件为空的判断,避免后续逻辑出错。
内容的提问来源于stack exchange,提问作者ouryuken
相关产品推荐
相关产品推荐

