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.
Songrui ef1519a49e 宋瑞-202506050301 3 weeks ago
..
README.md 宋瑞-202506050301 3 weeks ago
TemperatureConverter.java 宋瑞-202506050301 3 months ago
运行结果1.png 宋瑞-202506050301 3 weeks ago
运行结果2.png 宋瑞-202506050301 3 weeks ago

README.md

AI 交互记录 - Java 温度转换器开发

任务背景

开发一个支持摄氏度(C)与华氏度(F)互转的 Java 程序,要求具备多种运行模式和完善的异常处理。


需求分析

核心功能

  1. 温度转换:实现 C↔F 双向转换
  2. 多模式运行:支持交互式、命令行参数、批量转换三种模式
  3. 输入解析:智能识别温度值和单位
  4. 异常处理:处理非法输入、格式错误等场景

技术要求

  • 使用模块化设计,每个功能独立方法
  • 完整的中文注释(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
批量模式中断 单行异常不影响其他行处理

可扩展方向

  1. 文件读写:从文件读取批量数据
  2. 更多温标:支持开尔文(K)、兰氏度(R)
  3. 图形界面:使用 Swing/JavaFX
  4. 国际化:多语言支持
  5. 历史记录:保存转换历史

总结

代码特性

  • ✓ 三种运行模式(交互式、命令行、批量)
  • ✓ 完整的异常处理和输入验证
  • ✓ 模块化设计,高内聚低耦合
  • ✓ 详细的中文注释
  • ✓ 用户友好的提示信息

技术栈

  • Java SE(Scanner、String.format、ArrayList)
  • 异常处理(try-catch-finally)
  • 正则表达式(\\s+ 分割)
  • 集合框架(List、Array)

完成时间: 2026年5月28日
项目路径: D:\Project\java\w1\TemperatureConverter.java
代码行数: 238 行