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

Java读取txt文件列计算均值:代码执行异常排查需求

解决Scanner读取文件失败及保单平均成本计算问题

看起来你的代码有几个关键问题导致程序卡在前半段,没法执行到第二个打印标记,同时计算逻辑也存在错误。咱们一步步拆解修复:

1. 为什么执行不到System.out.println("2")?

最核心的问题是Scanner初始化错误:你写了input = new Scanner("archive.txt");,这行代码是把字符串"archive.txt"当成了输入内容,而不是去读取这个文件里的内容!

当程序执行到String cDate = input.next();时,它会读取字符串"archive.txt"作为cDate,接下来执行int cMinutes = input.nextInt();时,因为已经没有合法的整数输入了,会直接抛出InputMismatchException,程序崩溃,自然到不了第二个打印语句。

2. 其他需要修复的逻辑漏洞

除了Scanner的问题,你的代码还有几个明显的逻辑问题:

  • 只读取了一行数据:没有循环遍历archive.txt里的所有保单记录,就算Scanner初始化正确,也只会处理第一行。
  • 计数变量更新无效:iLargeBundle = iLargeBundle++;是错误写法,iLargeBundle++会先返回当前值再自增,赋值回去等于没变化,应该直接写iLargeBundle++;。
  • 平均计算逻辑颠倒:你写的iLargeBundle / iCost是保单数量除以总费用,完全反了,应该是总费用 ÷ 保单数量,而且整数除法会丢失精度,建议用double类型存储平均结果。
  • 未处理异常:读取文件时可能遇到文件不存在、格式错误等情况,需要捕获或声明异常。

3. 修正后的完整代码

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

public class PolicyCostCalculator {
    public double calculateHighUnlimitedAverage() throws FileNotFoundException { 
        // 正确初始化Scanner读取目标文件
        Scanner input = new Scanner(new File("archive.txt")); 
        int eligiblePolicyCount = 0; 
        int totalMonthlyCost = 0; 
        System.out.println("1: 开始读取保单文件"); 

        // 循环遍历所有行的保单数据
        while (input.hasNext()) {
            String cDate = input.next(); 
            int cMinutes = input.nextInt(); 
            int cData = input.nextInt(); 
            int cLength = input.nextInt(); 
            boolean cIntCalls = input.nextBoolean(); 
            String cReference = input.next(); 
            int cCostPerMonth = input.nextInt(); 
            String cFirstName = input.next(); 
            String cSecondName = input.next(); 

            System.out.println("2: 成功读取一行保单数据"); 

            // 判断是否符合高流量/无限流量条件
            if (cData == 3 || cData == 4) { 
                eligiblePolicyCount++; 
                totalMonthlyCost += cCostPerMonth; 
            }
        }
        input.close(); // 关闭Scanner释放IO资源

        // 处理无符合条件保单的边界情况,避免除以0
        if (eligiblePolicyCount == 0) {
            System.out.println("没有找到符合条件的保单记录");
            return 0.0;
        }
        // 强转成double避免整数除法丢失精度
        double averageCost = (double) totalMonthlyCost / eligiblePolicyCount; 
        return averageCost; 
    }

    // 测试入口
    public static void main(String[] args) {
        PolicyCostCalculator calculator = new PolicyCostCalculator();
        try {
            double avgCost = calculator.calculateHighUnlimitedAverage();
            System.out.println("符合条件的保单平均月度成本: " + avgCost);
        } catch (FileNotFoundException e) {
            System.out.println("错误:未找到archive.txt文件");
            e.printStackTrace();
        }
    }
}

关键修改说明

  • 用new Scanner(new File("archive.txt"))正确绑定目标文件,同时通过throws FileNotFoundException声明文件不存在的异常。
  • 用while(input.hasNext())循环遍历所有保单记录,确保不会遗漏数据。
  • 修正了计数和求和的逻辑,用更直观的变量名提升代码可读性。
  • 增加了无符合条件保单的判断,避免运行时出现除以0的错误。
  • 计算平均时将总费用强转为double,保留小数精度,更符合成本计算的实际需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:31:21