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
相关产品推荐
相关产品推荐

