You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java温度转换工具如何在whatNext方法执行上次同类型转换逻辑

问题根源

你遇到的是Java局部变量作用域问题:方法内部定义的变量属于局部变量,仅在当前方法运行时有效,方法执行完成后就会被销毁,因此whatNext方法无法访问whatToDo方法内定义的whatToConvert变量。

解决方案

在类中新增静态成员变量存储用户上一次选择的转换类型,静态变量属于类本身,类内所有静态方法都可直接访问,生命周期和类保持一致,刚好满足存储上一次操作的需求。同时可以把Scanner对象也提为全局静态变量,避免每个方法重复创建浪费资源。

具体修改点
  1. 在App类的所有方法外新增两个静态变量:
private static int lastConvertType;
private static Scanner scanner = new Scanner(System.in);
  1. 修改whatToDo方法,用户输入有效转换类型后将值存入lastConvertType,同时复用全局Scanner:
public static void whatToDo() {
    conversions();
    int whatToConvert = scanner.nextInt();
    if (whatToConvert >=1 && whatToConvert <=6) {
        // 存储上一次有效转换类型
        lastConvertType = whatToConvert;
    }
    if (whatToConvert == 1) {
        cF();
    } else if (whatToConvert == 2) {
        fC();
    } else if (whatToConvert == 3) {
        cK();
    } else if (whatToConvert == 4) {
        fK();
    } else if (whatToConvert == 5) {
        kC();
    } else if (whatToConvert == 6) {
        kF();
    } else {
        System.out.flush();
        System.out.println(whatToConvert + ": is a unknown command pls try again:");
        whatToDo();
    }
}
  1. 修改whatNext方法,用户选择1时根据lastConvertType调用对应转换方法:
public static void whatNext() {
    options();
    int choice = scanner.nextInt();
    if (choice == 1) {
        // 按上一次的转换类型执行
        switch (lastConvertType) {
            case 1: cF(); break;
            case 2: fC(); break;
            case 3: cK(); break;
            case 4: fK(); break;
            case 5: kC(); break;
            case 6: kF(); break;
        }
    } else if (choice == 2) {
        whatToDo();
    } else if (choice == 3) {
        System.exit(1);
    }
}
  1. 修复原有代码的小问题:
  • 每个转换方法内的局部Scanner删除,统一用全局的scanner
  • 修复kF方法输出单位错误,将最后的°C改为°F
修改后完整可运行代码
import java.util.Scanner;
public class App {
    // 全局静态变量存储上一次转换类型和共用Scanner
    private static int lastConvertType;
    private static Scanner scanner = new Scanner(System.in);

    public static void conversions() {
        System.out.println("What two temperatures would you like to convert?");
        System.out.println("[1]:celsius to fahrenheit");
        System.out.println("[2]:fahrenheit to celsius");
        System.out.println("[3]:celsius to kelvin");
        System.out.println("[4]:fahrenheit to kelvin");
        System.out.println("[5]:kelvin to celsius");
        System.out.println("[6]:kelvin to fahrenheit");
    }
    public static void options() {
        System.out.println("what would you like to do now?");
        System.out.println("[1]:convert the same thing");
        System.out.println("[2]:convert something else");
        System.out.println("[3]:exit");
    }
    public static void whatToDo() {
        conversions();
        int whatToConvert = scanner.nextInt();
        if (whatToConvert >=1 && whatToConvert <=6) {
            lastConvertType = whatToConvert;
        }
        if (whatToConvert == 1) {
            cF();
        } else if (whatToConvert == 2) {
            fC();
        } else if (whatToConvert == 3) {
            cK();
        } else if (whatToConvert == 4) {
            fK();
        } else if (whatToConvert == 5) {
            kC();
        } else if (whatToConvert == 6) {
            kF();
        } else {
            System.out.flush();
            System.out.println(whatToConvert + ": is a unknown command pls try again:");
            whatToDo();
        }
    }
    public static void whatNext() {
        options();
        int choice = scanner.nextInt();
        if (choice == 1) {
            switch (lastConvertType) {
                case 1: cF(); break;
                case 2: fC(); break;
                case 3: cK(); break;
                case 4: fK(); break;
                case 5: kC(); break;
                case 6: kF(); break;
            }
        } else if (choice == 2) {
            whatToDo();
        } else if (choice == 3) {
            System.exit(1);
        }
    }
    // 转换方法
    public static void cF() {
        System.out.println("please enter the temperature in celsius:");
        double cToF = scanner.nextDouble();
        System.out.println(cToF + "°C is about " + (cToF * 1.8 + 32) + "°F");
    }
    public static void fC() {
        System.out.println("please enter the temperature in fahrenheit:");
        double fToC = scanner.nextDouble();
        System.out.println(fToC + "°F is about " + (fToC - 32) / 1.8 + "°C");
    }
    public static void cK() {
        System.out.println("enter the temperature in celsius:");
        double cToK = scanner.nextDouble();
        System.out.println(cToK + "°C is about " + (cToK + 273.15) + "°K");
    }
    public static void fK() {
        System.out.println("enter the temperature in fahrenheit:");
        double fToK = scanner.nextDouble();
        System.out.println(fToK + "°F is about " + ((fToK - 32)*5/9 + 273.15) + "°K");
    }
    public static void kC() {
        System.out.println("enter the temperature in kelvin:");
        double kToC = scanner.nextDouble();
        System.out.println(kToC + "°K is about " + (kToC - 273.15) + "°C");
    }
    public static void kF() {
        System.out.println("enter the temperature in kelvin:");
        double kToF = scanner.nextDouble();
        System.out.println(kToF + "°K is about " + ((kToF - 273.15)* 9/5 + 32) + "°F");
    }

    public static void main(String[] args) throws Exception {
        while (true) {
            whatToDo();
            whatNext();
        }
    }
}

内容的提问来源于stack exchange,提问作者user17236093

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:24:01