【问题标题】:Java nested loop issue with switch statement带有switch语句的Java嵌套循环问题
【发布时间】:2023-04-01 00:59:02
【问题描述】:

对于案例“1”,它似乎只是循环而不是跳转到drunkSong();。如果用户选择案例“2”,它将正常工作并要求用户输入数字以返回 int“BeerNum”。

案例“1”需要接受默认值 99,而案例“2”需要接受用户输入。

我附上了代码,如果你能指出我的错误或我哪里出错了。

package PartOne;
import java.util.Scanner;

public class View {

    public void begin() {
        BeerSong.drunkSong();
    }

    private int setBeerNum() {
        return beerNum;
    }

    private int beerNum;

    public Integer Menu() {
        Scanner in = new Scanner(System.in);
        // print menu
        for (int i = 1; i <= 3; i++)
            System.out.println(i + ". Menu item #" + i);

        System.out.println("0. Quit");
        // handle user commands
        boolean quit = false;
        int menuItem;
        do {
            System.out.print("Choose menu item: ");
            menuItem = in.nextInt();
            switch (menuItem) {
                case 1:
                    System.out.println("Default ");
                    begin();
                    while (true)
                        try {
                            //where I have made a mistake
                            beerNum = 99;
                            this.beerNum = setBeerNum();
                            break;

                        } catch (NumberFormatException BecauseIsaidSo) {
                            System.out.print("Try again: ");
                        }

                    //working
                case 2:
                    System.out.println("Enter your number to play the song: ");
                    Scanner scan = new Scanner(System.in);
                    while (true)
                        try {
                            beerNum = Integer.parseInt(scan.nextLine());
                            this.beerNum =  setBeerNum();
                            return beerNum;

                        } catch (NumberFormatException BecauseIsaidSo) {
                            System.out.print("Try again: ");
                        }
                case 0:
                    quit = true;
                    break;

                default:
                    System.out.println("Invalid choice.");
            }
        }
        while (!quit) ;
        System.out.println("Bye-bye!");
        return null;
    }
}

【问题讨论】:

  • 您是否尝试添加中断;每种情况?
  • @SomasundaramSekar 这不会有丝毫不同。
  • drunkSong 是做什么的?此外,您应该为您的 switch case 使用常量或枚举。 setBeerNum 对于 getter 来说也是一个很奇怪的名字。您可以提高此代码的可读性,干净的代码是无错误代码的第一步。
  • 另外,您的代码无法编译:setBeerNum() 与正确的签名不匹配。你能提供实际可编译和可执行的代码吗?
  • 修正编译问题,复制粘贴错误,抱歉。我有一段时间没想到会有回应,我想我会有时间整理一下。抱歉第一次发帖。

标签: java loops switch-statement java.util.scanner


【解决方案1】:

我认为将菜单逻辑封装在单独的类中并将所有逻辑封装在其中会更好。此外,每个菜单项的逻辑也应该封装在单独的方法中。

public final class Menu {

    private Integer res;
    private boolean quit;

    public static Integer showMenuAndGetResult() {
        Menu menu = new Menu();
        menu.activate();
        return menu.res;
    }

    private Menu() {
    }

    private void activate() {
        try (Scanner in = new Scanner(System.in)) {
            show();

            while (!quit) {
                System.out.print("Choose menu item: ");
                int menuItem = in.nextInt();

                if (menuItem == 1)
                    onMenuItem1(in);
                else if (menuItem == 2)
                    onMenuItem2(in);
                else if (menuItem == 0)
                    onMenuQuit();
                else
                    System.out.println("Invalid choice.");
            }

            System.out.println("Bye-bye!");
        }
    }

    private void show() {
        for (int i = 1; i <= 3; i++)
            System.out.println(i + ". Menu item #" + i);

        System.out.println("0. Quit");
        System.out.println();
    }

    private void onMenuItem1(Scanner scan) {
        System.out.println("Default ");
        // TODO menu 1 logic incapsulation
    }

    private void onMenuItem2(Scanner scan) {
        System.out.println("Enter your number to play the song: ");
        // TODO menu 2 logic incapsulation
    }

    private void onMenuQuit() {
        res = null;
        quit = true;
    }

}

P.S.我个人尽量避免使用switch。这不是我的建议,请注意。我认为 if...else if 更具可读性和无问题。

【讨论】:

  • 虽然是真的,但似乎没有回答为什么代码没有按预期运行的问题
  • @Dici 对于某些代码,最好提供更合适的解决方案而不是发现问题。这对请求者来说也更好,因为他的代码不是最优的。可能重新格式化代码,请求者自己发现问题。
  • 是的,这就是我在评论中建议进行一些清理的原因,但我认为这不能成为答案。我猜不同的意见:)
  • 大家好,感谢您的帮助。 @oleg,您的方法有效,谢谢。这是 Github 中的链接:github.com/Draken62/Java-Project/blob/master/src/PartOne/…
  • 有谁知道,我如何将这个答案解析为已解决?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 2015-12-23
相关资源
最近更新 更多