Java如何无需重复代码实现功能菜单跳转返回?
解决方案
核心通过外层循环包裹主菜单+功能逻辑方法抽取实现无重复代码返回主菜单,同时还优化了你代码中年龄计算的逻辑错误(原代码用了取模%,实际年龄应为当前年份减出生年份),额外补充了非法输入校验避免程序崩溃。
实现思路
- 外层加无限循环包裹主菜单逻辑,每次功能结束后自动回到菜单选择环节
- 将简易计算器、年龄计算器的执行逻辑分别封装为独立方法,避免代码冗余,后续修改功能只需调整对应方法即可
- 功能内部的用户选择:选1继续执行当前功能,选2直接跳出当前功能的内层循环回到主菜单,选3直接终止程序
优化后完整代码
import java.util.Scanner; public class CalculatorTest { // 统一Scanner全局复用,避免多次创建对象 private static final Scanner mexam = new Scanner(System.in); public static void main(String[] args) { // 外层死循环包裹主菜单,实现返回逻辑 while (true) { System.out.print("Enter 1 - Simple Calculator, Enter 2 - Age Calculator: "); int choice = mexam.nextInt(); if (choice == 1) { runSimpleCalculator(); } else if (choice == 2) { runAgeCalculator(); } else { System.out.println("Invalid choice, please enter 1 or 2"); } } } // 抽取简易计算器逻辑为独立方法 private static void runSimpleCalculator() { int choice1; do { System.out.println("********************Simple Calculator********************"); System.out.print("Enter first number: "); int firstNumber = mexam.nextInt(); System.out.print("Enter second number: "); int secondNumber = mexam.nextInt(); System.out.print("Enter operator: "); String operator = mexam.next(); int result; switch (operator) { case "+": result = firstNumber + secondNumber; System.out.println("Sum: " + result); break; case "-": result = firstNumber - secondNumber; System.out.println("Difference: " + result); break; case "*": result = firstNumber * secondNumber; System.out.println("Product: " + result); break; case "/": // 补充除数为0的校验,避免程序崩溃 if (secondNumber == 0) { System.out.println("Divisor cannot be 0"); break; } result = firstNumber / secondNumber; System.out.println("Quotient: " + result); break; default: System.out.println("Invalid Operator"); } System.out.println("*********************************************************"); System.out.println("*********************************************************"); System.out.print("Enter 1 - Continue, Enter 2 - Menu, Enter 3 - End: "); choice1 = mexam.nextInt(); // 选3直接终止整个程序 if (choice1 == 3) { System.exit(0); } // 只有选1才继续当前功能,选2直接跳出循环回到主菜单 } while (choice1 == 1); } // 抽取年龄计算器逻辑为独立方法 private static void runAgeCalculator() { int choice2; do { System.out.println("*********************Age Calculator**********************"); int year = 2021, result1; System.out.print("Enter birth year: "); int birthyear = mexam.nextInt(); // 修复原代码年龄计算错误,补充非法年份校验 if (birthyear > year || birthyear <= 0) { System.out.println("Invalid birth year"); } else { result1 = year - birthyear; System.out.println("Age: " + result1); } System.out.println("*********************************************************"); System.out.println("*********************************************************"); System.out.print("Enter 1 - Continue, Enter 2 - Menu, Enter 3 - End: "); choice2 = mexam.nextInt(); if (choice2 == 3) { System.exit(0); } } while (choice2 == 1); } }
内容的提问来源于stack exchange,提问作者Ban
相关产品推荐
相关产品推荐

