You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

6.1 KiB

AI 交互记录 - Java 代码重构

任务背景

将一段存在资源泄漏和异常处理缺失的 Java 代码进行重构,实现从 scores.txt 文件读取成绩并计算平均分的功能。


原始代码(重构前)

BufferedReader br = new BufferedReader(new FileReader("scores.txt"));
String line;
while ((line = br.readLine()) != null) {
    sum += Integer.parseInt(line);
}
br.close();

存在的问题

  1. 无异常处理(文件不存在、IO错误、数字格式错误)
  2. 手动关闭资源,可能发生资源泄漏
  3. 硬编码除数,无法动态计算
  4. 整数除法导致精度丢失

交互过程

第1轮:需求分析与初步指导

用户需求:
重构代码,要求:

  1. 添加完整异常处理(文件不存在、读取错误、NumberFormatException)
  2. 强制使用 try-with-resources
  3. 从新建文件开始分步指导

AI 响应:

  • 建议在 D:\Project\java\练习 创建 ScoreCalculator.java
  • 提供包含三层异常处理的完整代码
  • 说明编译运行步骤

第2轮:文件位置确认

用户反馈:
已在 D:\Project\java\w7 目录下创建了两个文件

AI 检查结果:

  • ScoreCalculator.java (1.9KB) - 代码结构正确
  • scores.txt - 测试数据已准备
  • 💡 建议添加命令行参数支持以增强灵活性

第3轮:路径问题首次出现

报错信息:

错误:文件 scores.txt 不存在!

问题分析:
程序运行时的工作目录与文件所在目录不匹配

AI 提供的解决方案:

  1. 使用 getResource() 动态获取路径
  2. 使用绝对路径
  3. 在正确的目录下运行程序

第4轮:getResource 引发新错误

报错信息:

java.nio.file.InvalidPathException: Illegal char <:> at index 3: 
/D:/Project/java/out/production/Project/scores.txt

根本原因:
Windows 系统下 getResource() 返回的路径包含 /D:/ 前缀,导致 Paths.get() 解析失败

AI 修复方案:
移除 getResource() 逻辑,改用简单的相对路径配合正确的运行目录


第5轮:工作目录确认

用户反馈:

当前工作目录:D:\Project\java

问题定位:
IDEA 默认在项目根目录运行,而文件在 w7 子目录

最终解决方案:
使用绝对路径 "D:\\Project\\java\\w7\\scores.txt",确保无论从何处运行都能找到文件


第6轮:生成对比文档

用户需求:
输出重构前后完整代码及关键改动点,用于对比截图

AI 输出内容:

  • 重构前代码(8行)
  • 重构后代码(56行)
  • 8项关键改进对比表

第7轮:生成交互记录

用户需求:
生成完整的 AI 交互记录文档

AI 生成:
包含任务背景、交互过程、技术要点、测试数据的完整 Markdown 文档


第8轮:修复 Markdown 格式错误

报错信息:

Line 18: while ((line = br.readLine()) != null) {
Error: 应为 'class' 或 'interface'

问题原因:
Markdown 文件中代码块缺少正确的语言标记

AI 修复:
为所有代码块添加 java 或 标记,确保语法高亮正确


重构前后对比

对比维度 重构前 重构后
代码行数 8 行 56 行
资源管理 手动 br.close() try-with-resources 自动关闭
文件存在性检查 预检查 + 友好提示
IO 异常处理 catch (IOException)
格式异常处理 catch (NumberFormatException)
空行处理 trim() + 跳过空行
成绩计数 硬编码除以 4 动态统计 count
平均分精度 整数除法(丢失精度) double 类型,保留2位小数
文件路径 相对路径 绝对路径 + 命令行参数支持
输出信息 仅平均分 有效数量、总分、平均分

核心技术要点

1. try-with-resources 语法

try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {
    // 自动关闭资源,无需手动调用 close()
} catch (IOException e) {
    // 异常处理
}

2. 三层异常处理机制

  • 文件存在性预检查Files.exists(Paths.get(fileName))
  • IO 异常捕获catch (IOException e)
  • 数字格式异常捕获catch (NumberFormatException e)

3. 健壮性增强

  • 去除首尾空格:line.trim()
  • 跳过空行:if (line.isEmpty()) continue;
  • 动态计数:避免硬编码

4. 精度提升

double average = (double) sum / count;  // 强制类型转换
System.out.printf("平均分:%.2f%n", average);  // 保留2位小数

测试验证

测试数据(scores.txt)

85
90
78
abc
92

预期输出

警告:无效的成绩格式 'abc',已跳过该行
共读取 4 个有效成绩
总分:345
平均分:86.25

测试场景覆盖

  • 正常数字读取(85, 90, 78, 92)
  • 非法格式处理(abc)
  • 空行跳过
  • 动态计数与平均值计算
  • 文件不存在提示

遇到的问题与解决方案

问题 原因 解决方案
文件找不到 工作目录不匹配 使用绝对路径
InvalidPathException getResource 返回 /D:/ 格式 移除 getResource,使用绝对路径
Markdown 解析错误 代码块缺少语言标记 添加 ```java 标记

最终成果

代码特性

  • ✓ 完整的异常处理机制
  • ✓ 自动资源管理(try-with-resources)
  • ✓ 支持命令行参数覆盖文件路径
  • ✓ 友好的错误提示信息
  • ✓ 精确的平均分计算(保留2位小数)
  • ✓ 健壮的空行和格式处理

文件清单

  • D:\Project\java\w7\ScoreCalculator.java - 主程序
  • D:\Project\java\w7\scores.txt - 测试数据
  • D:\Project\java\w7\ReadMe.md - 交互记录文档

完成时间: 2026年5月28日
项目路径: D:\Project\java\w7
技术栈: Java IO、异常处理、try-with-resources