1 changed files with 228 additions and 36 deletions
@ -1,56 +1,248 @@ |
|||
AI 交互记录 - Java 代码重构 |
|||
任务背景 |
|||
重构"裸奔"的 Java 代码,实现从 scores.txt 读取成绩并计算平均分的功能。 |
|||
# AI 交互记录 - Java 代码重构 |
|||
|
|||
交互过程 |
|||
第1轮:初始需求 |
|||
原始代码 |
|||
## 任务背景 |
|||
将一段存在资源泄漏和异常处理缺失的 Java 代码进行重构,实现从 `scores.txt` 文件读取成绩并计算平均分的功能。 |
|||
|
|||
--- |
|||
|
|||
## 原始代码(重构前) |
|||
|
|||
```java |
|||
BufferedReader br = new BufferedReader(new FileReader("scores.txt")); |
|||
String line; |
|||
while ((line = br.readLine()) != null) { |
|||
sum += Integer.parseInt(line); |
|||
} |
|||
br.close(); |
|||
重构要求: |
|||
添加完整的异常处理(文件不存在、读取错误、数字格式错误) |
|||
强制使用 try-with-resources 语法 |
|||
第2轮:文件创建与初步指导 |
|||
AI 回复要点: |
|||
建议在 D:\Project\java\练习 目录创建 ScoreCalculator.java |
|||
提供完整代码,包含三层异常处理 |
|||
说明编译运行步骤 |
|||
关键代码片段: |
|||
``` |
|||
|
|||
|
|||
### 存在的问题 |
|||
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 语法 |
|||
```java |
|||
try (BufferedReader br = new BufferedReader(new FileReader(fileName))) { |
|||
// 读取逻辑 |
|||
// 自动关闭资源,无需手动调用 close() |
|||
} catch (IOException e) { |
|||
// 异常处理 |
|||
} |
|||
技术要点总结 |
|||
核心改进 |
|||
资源管理:手动关闭 → try-with-resources 自动关闭 |
|||
异常处理:无处理 → 三层捕获(文件存在性、IO、格式) |
|||
健壮性:空行处理、trim、动态计数 |
|||
精度提升:整数除法 → double 类型保留2位小数 |
|||
遇到的问题 |
|||
❌ 相对路径导致文件找不到 |
|||
❌ getResource() 在 Windows 下路径格式错误 |
|||
✅ 最终使用绝对路径解决 |
|||
最终代码特性 |
|||
✓ 完整的异常处理机制 |
|||
✓ 自动资源管理 |
|||
✓ 支持命令行参数覆盖 |
|||
✓ 友好的错误提示 |
|||
✓ 精确的平均分计算 |
|||
|
|||
测试数据 |
|||
scores.txt 内容: |
|||
``` |
|||
|
|||
|
|||
### 2. 三层异常处理机制 |
|||
- **文件存在性预检查**:`Files.exists(Paths.get(fileName))` |
|||
- **IO 异常捕获**:`catch (IOException e)` |
|||
- **数字格式异常捕获**:`catch (NumberFormatException e)` |
|||
|
|||
### 3. 健壮性增强 |
|||
- 去除首尾空格:`line.trim()` |
|||
- 跳过空行:`if (line.isEmpty()) continue;` |
|||
- 动态计数:避免硬编码 |
|||
|
|||
### 4. 精度提升 |
|||
```java |
|||
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 |
|||
Loading…
Reference in new issue