# AI 交互记录 - Java 代码重构 ## 任务背景 将一段存在资源泄漏和异常处理缺失的 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(); ``` ### 存在的问题 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) { // 异常处理 } ``` ### 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