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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 02:12:20