【问题标题】:While loop randomly looping.Can't figure out why.虽然循环随机循环。无法弄清楚为什么。
【发布时间】:2017-11-08 09:13:21
【问题描述】:

这里是 Java 菜鸟。我正在尝试编写一个“应用程序菜单”程序,为用户提供他们可以运行的不同应用程序的主菜单。一旦他们做出选择,该应用程序就会运行,然后为他们提供返回主菜单或退出程序的选项。我在这里遇到了一个问题,如果用户通过反复返回主菜单来运行多个应用程序,当他们最终选择退出程序的选项时,他们会被提示选择退出的次数与用户运行不同的应用程序。意思是,如果在运行期间,他们运行应用程序 4 次,他们会重新提示“1 返回主菜单或 2 退出”提示 4 次。帮忙??

public class Menu {
    private MathPractice math = new MathPractice();
    private Scanner scan = new Scanner(System.in);
    private Calculator calc = new Calculator();
    private BasePage base = new BasePage();
    private String menuHeader = "Welcome to the Math Applications Menu";

    public void mainMenu()
    {
        while (true){
            System.out.println();
            base.headerUnderline(menuHeader);
            System.out.println(menuHeader);
            base.headerUnderline(menuHeader);
            System.out.println("Enter 1 for Bill Pay");
            System.out.println("Enter 2 for Multiplication Table");
            System.out.println("Enter 3 for Test Score");
            System.out.println("Enter 4 for Calculator");
            base.headerUnderline(menuHeader);

            int userChoice = scan.nextInt();

            if (userChoice == 1)
            {
                math.billPay();
                postAppMenu();
                break;
            }
            else if (userChoice == 2)
            {
                math.multiplicationTable();
                postAppMenu();
                break;
            }
            else if (userChoice == 3)
            {
                math.testScore();
                postAppMenu();
                break;
            }
            else if (userChoice == 4)
            {
                calc.calculator();
                postAppMenu();
                break;
            }
            else {
                System.out.println("Please select a valid option!");
            }
        }
    }

    private void postAppMenu()
    {
        while (true){
            base.headerUnderline(menuHeader);
            System.out.println("Enter 1 for Main Menu");
            System.out.println("Enter 2 to Quit");
            base.headerUnderline(menuHeader);

            int userChoice = scan.nextInt();

            if (userChoice == 1){
                mainMenu();
            }
            else if (userChoice == 2){
                System.out.println("Thank your for using the Math Application.");
                System.out.println("Have a good day. Goodbye.");
                break;
            }else {
                System.out.println("That's not a valid selection");
            }
        }

    }
}

【问题讨论】:

标签: java while-loop


【解决方案1】:

您正在从 postAppMenu 调用 mainMenu。没有坐在这里做一个完整的静态分析,我认为发生的是每次你进入 postAppMenu 时,你再次调用 mainMenu,这意味着你正在更深入地进入函数堆栈。当你最终决定退出时,它必须一次回滚一层。

尝试重写,而不是从 postAppMenu 调用 mainMenu,您只需让 postAppMenu“返回”到 mainMenu。

除非您打算实现某种递归算法,否则方法 A 调用调用方法 A 的方法 B 通常不是一个好主意。可以这样做,但可能会很棘手。

【讨论】:

  • +1 用于重新设计。我的回答又快又脏。不过你是对的,重新思考/重新设计程序循环将是最好的行动方案。
【解决方案2】:

如果在调用 mainMenu 后中断 postAppMenu 方法会发生什么?

    if (userChoice == 1){
        mainMenu();
        break;
    }

【讨论】:

  • 这绝对可以解决问题,谢谢!试图把我的头脑围绕在这个逻辑上!
  • 在 postAppMenu() 中,当 mainMenu();被称为 postAppMenu 仍在执行并等待 mainMenu 返回,这就是您获得该行为的原因。设计更好的外循环会在 postAppMenu 返回后优雅地重新显示主菜单。
猜你喜欢
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
  • 2013-10-07
  • 2023-03-25
  • 1970-01-01
相关资源
最近更新 更多