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