Java温度转换工具如何在whatNext方法执行上次同类型转换逻辑
问题根源
你遇到的是Java局部变量作用域问题:方法内部定义的变量属于局部变量,仅在当前方法运行时有效,方法执行完成后就会被销毁,因此whatNext方法无法访问whatToDo方法内定义的whatToConvert变量。
解决方案
在类中新增静态成员变量存储用户上一次选择的转换类型,静态变量属于类本身,类内所有静态方法都可直接访问,生命周期和类保持一致,刚好满足存储上一次操作的需求。同时可以把Scanner对象也提为全局静态变量,避免每个方法重复创建浪费资源。
具体修改点
- 在App类的所有方法外新增两个静态变量:
private static int lastConvertType; private static Scanner scanner = new Scanner(System.in);
- 修改
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(); } }
- 修改
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); } }
- 修复原有代码的小问题:
- 每个转换方法内的局部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
相关产品推荐
相关产品推荐

