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 | |
| TemperatureConverter.java | 3 months ago | |
| 运行结果1.png | 3 weeks ago | |
| 运行结果2.png | 3 weeks ago | |
README.md
AI 交互记录 - Java 温度转换器开发
任务背景
开发一个支持摄氏度(C)与华氏度(F)互转的 Java 程序,要求具备多种运行模式和完善的异常处理。
需求分析
核心功能
- 温度转换:实现 C↔F 双向转换
- 多模式运行:支持交互式、命令行参数、批量转换三种模式
- 输入解析:智能识别温度值和单位
- 异常处理:处理非法输入、格式错误等场景
技术要求
- 使用模块化设计,每个功能独立方法
- 完整的中文注释(Javadoc 风格)
- 遵循 Java 代码规范
- 友好的用户提示
开发过程
第1轮:基础转换方法实现
用户需求:
实现摄氏度与华氏度的互相转换
AI 实现:
public static float celsiusToFahrenheit(float c) {
return c * 9.0f / 5.0f + 32.0f;
}
public static float fahrenheitToCelsius(float f) {
return (f - 32.0f) * 5.0f / 9.0f;
}
技术要点:
- 使用
float类型保证精度 - 浮点数运算使用
9.0f避免整数除法 - 静态方法便于直接调用
第2轮:输入解析功能
用户需求:
解析用户输入字符串,提取温度值和单位
AI 实现:
public static float[] parseInput(String input) {
// 1. 空值检查
if (input == null || input.trim().isEmpty()) {
throw new IllegalArgumentException("输入为空");
}
// 2. 分割字符串
String[] parts = input.trim().split("\\s+");
// 3. 解析数值
float value = Float.parseFloat(parts[0]);
// 4. 解析单位(默认 C)
String unit = parts.length > 1 ? parts[1].toUpperCase() : "C";
// 5. 验证单位合法性
if (!unit.startsWith("C") && !unit.startsWith("F")) {
throw new IllegalArgumentException("未知单位 '" + unit + "'");
}
return new float[]{value, unit.equals("F") ? 1.0f : 0.0f};
}
设计决策:
- 返回
float[]数组:[0]存储数值,[1]用 0/1 标识单位 - 使用正则
\\s+分割,兼容多个空格 - 默认单位为摄氏度,提升用户体验
第3轮:格式化输出
用户需求:
将转换结果格式化为易读的字符串
AI 实现:
public static String convertAndFormat(float value, boolean isFahrenheit) {
if (isFahrenheit) {
float celsius = fahrenheitToCelsius(value);
return String.format("%.2f °F = %.2f °C", value, celsius);
} else {
float fahrenheit = celsiusToFahrenheit(value);
return String.format("%.2f °C = %.2f °F", value, fahrenheit);
}
}
技术亮点:
- 使用
String.format()统一格式化 - 保留两位小数
%.2f - 包含单位符号
°C/°F
第4轮:交互式模式
用户需求:
从标准输入读取用户输入并转换
AI 实现:
public static void interactiveMode() {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入要转换的温度与单位(例如 36.6 C 或 97 F):");
String input = scanner.nextLine().trim();
if (input.isEmpty()) {
System.out.println("输入为空,程序退出。");
scanner.close();
return;
}
try {
float[] parsed = parseInput(input);
float value = parsed[0];
boolean isFahrenheit = (parsed[1] == 1.0f);
String result = convertAndFormat(value, isFahrenheit);
System.out.println(result);
} catch (IllegalArgumentException e) {
System.out.println("输入解析失败:" + e.getMessage());
} finally {
scanner.close();
}
}
异常处理策略:
try-catch-finally确保资源释放- 捕获
IllegalArgumentException提供友好提示 - 空输入提前返回,避免无效计算
第5轮:命令行参数模式
用户需求:
支持通过命令行参数直接传入温度值
AI 实现:
public static void commandLineMode(String[] args) {
if (args.length < 1) {
System.out.println("用法:java TemperatureConverter <温度值> [单位]");
System.out.println("示例:java TemperatureConverter 36.6 C");
return;
}
try {
float value = Float.parseFloat(args[0]);
String unit = (args.length > 1) ? args[1].toUpperCase() : "C";
if (!unit.startsWith("C") && !unit.startsWith("F")) {
throw new IllegalArgumentException("未知单位 '" + unit + "'");
}
boolean isFahrenheit = unit.startsWith("F");
String result = convertAndFormat(value, isFahrenheit);
System.out.println(result);
} catch (NumberFormatException e) {
System.out.println("错误:温度值必须是数字,收到:" + args[0]);
} catch (IllegalArgumentException e) {
System.out.println("错误:" + e.getMessage());
}
}
使用示例:
java TemperatureConverter 36.6 C
java TemperatureConverter 97 F
第6轮:批量转换模式
用户需求:
从多行输入中批量转换温度数据
AI 实现:
public static void batchConvertMode(String[] lines) {
System.out.println("=== 批量转换开始 ===");
int successCount = 0;
int failCount = 0;
for (int i = 0; i < lines.length; i++) {
String line = lines[i].trim();
if (line.isEmpty()) continue;
System.out.printf("第 %d 行:", i + 1);
try {
float[] parsed = parseInput(line);
float value = parsed[0];
boolean isFahrenheit = (parsed[1] == 1.0f);
String result = convertAndFormat(value, isFahrenheit);
System.out.println(result);
successCount++;
} catch (IllegalArgumentException e) {
System.out.println("失败 - " + e.getMessage());
failCount++;
}
}
System.out.println("=== 批量转换结束 ===");
System.out.printf("成功:%d 条,失败:%d 条%n", successCount, failCount);
}
设计特点:
- 统计成功/失败数量
- 逐行显示转换结果
- 单行失败不影响其他行处理
第7轮:主入口整合
用户需求:
整合三种运行模式到 main() 方法
AI 实现:
public static void main(String[] args) {
// 批量转换模式
if (args.length > 0 && "--batch".equals(args[0])) {
Scanner scanner = new Scanner(System.in);
java.util.List<String> lines = new java.util.ArrayList<>();
while (true) {
String line = scanner.nextLine().trim();
if (line.isEmpty()) break;
lines.add(line);
}
scanner.close();
batchConvertMode(lines.toArray(new String[0]));
return;
}
// 根据参数选择模式
if (args.length > 0) {
commandLineMode(args);
} else {
interactiveMode();
}
}
模式切换逻辑:
- 无参数 → 交互式模式
- 有参数(非
--batch)→ 命令行参数模式 --batch参数 → 批量转换模式
最终代码结构
| 方法名 | 功能 | 行数 |
|---|---|---|
celsiusToFahrenheit() |
摄氏转华氏 | 3 |
fahrenheitToCelsius() |
华氏转摄氏 | 3 |
parseInput() |
解析输入字符串 | 30 |
convertAndFormat() |
格式化输出结果 | 10 |
interactiveMode() |
交互式模式 | 26 |
commandLineMode() |
命令行参数模式 | 26 |
batchConvertMode() |
批量转换模式 | 34 |
main() |
程序入口 | 28 |
总计: 238 行(含注释和空行)
核心技术要点
1. 模块化设计
- 每个功能独立为静态方法
- 方法职责单一,易于测试和维护
- 复用
parseInput()和convertAndFormat()避免重复代码
2. 异常处理机制
- 输入验证:空值检查、格式验证
- 数值解析:捕获
NumberFormatException - 业务逻辑:抛出
IllegalArgumentException - 资源管理:
finally块确保 Scanner 关闭
3. 用户友好性
- 详细的错误提示信息
- 支持默认单位(C)
- 批量模式提供统计信息
- 使用示例清晰明了
4. 代码规范
- Javadoc 风格注释(类、方法、参数)
- 驼峰命名法
- 合理的缩进和空行
- 魔法数字提取为常量(可选优化)
测试用例
测试1:交互式模式
输入:36.6 C
输出:36.60 °C = 97.88 °F
测试2:命令行参数模式
$ java TemperatureConverter 97 F
输出:97.00 °F = 36.11 °C
测试3:批量转换模式
输入:
36.6 C
97 F
abc X
100 C
输出:
=== 批量转换开始 ===
第 1 行:36.60 °C = 97.88 °F
第 2 行:97.00 °F = 36.11 °C
第 3 行:失败 - 温度值必须是数字:abc
第 4 行:100.00 °C = 212.00 °F
=== 批量转换结束 ===
成功:3 条,失败:1 条
测试4:异常处理
输入:abc C
输出:输入解析失败:温度值必须是数字:abc
请按示例输入数值与单位,例如:36.6 C
遇到的问题与解决方案
| 问题 | 解决方案 |
|---|---|
| 浮点数精度丢失 | 使用 float 类型和 9.0f 后缀 |
| 输入格式多样 | 使用正则 \\s+ 灵活分割 |
| 单位大小写不一 | 统一转为大写 toUpperCase() |
| 资源泄漏风险 | finally 块确保关闭 Scanner |
| 批量模式中断 | 单行异常不影响其他行处理 |
可扩展方向
- 文件读写:从文件读取批量数据
- 更多温标:支持开尔文(K)、兰氏度(R)
- 图形界面:使用 Swing/JavaFX
- 国际化:多语言支持
- 历史记录:保存转换历史
总结
代码特性
- ✓ 三种运行模式(交互式、命令行、批量)
- ✓ 完整的异常处理和输入验证
- ✓ 模块化设计,高内聚低耦合
- ✓ 详细的中文注释
- ✓ 用户友好的提示信息
技术栈
- Java SE(Scanner、String.format、ArrayList)
- 异常处理(try-catch-finally)
- 正则表达式(
\\s+分割) - 集合框架(List、Array)
完成时间: 2026年5月28日
项目路径: D:\Project\java\w1\TemperatureConverter.java
代码行数: 238 行