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.
|
|
3 weeks ago | |
|---|---|---|
| .. | ||
| ReadMe.md | 3 weeks ago | |
| ScoreCalculator.java | 3 weeks ago | |
| scores.txt | 3 weeks ago | |
| 运行结果.png | 3 weeks ago | |
| 重构前代码.png | 3 weeks ago | |
| 重构后代码.png | 3 weeks ago | |
ReadMe.md
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();
存在的问题
- ❌ 无异常处理(文件不存在、IO错误、数字格式错误)
- ❌ 手动关闭资源,可能发生资源泄漏
- ❌ 硬编码除数,无法动态计算
- ❌ 整数除法导致精度丢失
交互过程
第1轮:需求分析与初步指导
用户需求:
重构代码,要求:
- 添加完整异常处理(文件不存在、读取错误、NumberFormatException)
- 强制使用 try-with-resources
- 从新建文件开始分步指导
AI 响应:
- 建议在
D:\Project\java\练习创建ScoreCalculator.java - 提供包含三层异常处理的完整代码
- 说明编译运行步骤
第2轮:文件位置确认
用户反馈:
已在 D:\Project\java\w7 目录下创建了两个文件
AI 检查结果:
- ✅
ScoreCalculator.java(1.9KB) - 代码结构正确 - ✅
scores.txt- 测试数据已准备 - 💡 建议添加命令行参数支持以增强灵活性
第3轮:路径问题首次出现
报错信息:
错误:文件 scores.txt 不存在!
问题分析:
程序运行时的工作目录与文件所在目录不匹配
AI 提供的解决方案:
- 使用
getResource()动态获取路径 - 使用绝对路径
- 在正确的目录下运行程序
第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