Browse Source

宋瑞-202506050301

main
Songrui 3 weeks ago
parent
commit
63b7041010
  1. 264
      w7/ReadMe.md

264
w7/ReadMe.md

@ -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…
Cancel
Save