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

Java读取文件计算数值总和与平均值时遇异常及跳读问题求助

问题分析与解决方案

异常原因

原代码未给while循环加大括号时,循环仅作用于下一行的System.out.println(bru.nextDouble());语句。当循环耗尽文件中所有数值后,后续的value = bru.nextDouble();和System.out.println(bru.nextDouble());仍会尝试读取不存在的元素,直接触发NoSuchElementException。

加括号后出现“读取一个跳过一个”的问题,本质是循环中重复调用nextDouble()——每次调用都会让Scanner指针移动到下一个元素,多次调用就会跳过中间的数值。

修正代码(实现求和与平均值)

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Project4 {
    public static void main(String[] args) throws FileNotFoundException {
        System.out.println("Enter the name of the file :");
        
        Scanner scan = new Scanner(System.in);
        String filename = scan.next();
        scan.close();
        
        Scanner bru = new Scanner(new File(filename));
        
        int num = bru.nextInt();
        System.out.println("The file " + filename + " has " + num + " numbers in it");
        
        System.out.println("Content of file is");
        double total = 0.0; 
        int count = 0;
        
        while(bru.hasNextDouble() && count < num) {
            double currentValue = bru.nextDouble();
            System.out.println(currentValue);
            total += currentValue;
            count++;
        }
        
        bru.close();
        
        if(count > 0) {
            double average = total / count;
            System.out.println("Total sum: " + total);
            System.out.println("Average: " + average);
        } else {
            System.out.println("No valid numbers found in the file.");
        }
    }
}

关键修正点

  • 避免重复读取:每次循环仅调用一次nextDouble(),将读取到的数值存入变量,后续打印、累加都使用该变量,不会跳过元素。
  • 循环边界控制:同时判断hasNextDouble()和count < num,既防止文件提前结束,也避免读取超出声明的数值个数。
  • 资源关闭:及时关闭不再使用的Scanner,避免资源泄漏。
  • 安全计算平均值:先判断是否有有效数值,避免出现除以0的异常。

内容的提问来源于stack exchange,提问作者zflocka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:10:15