Проблема вложенного цикла Java с оператором switch - PullRequest
0 голосов
/ 30 сентября 2018

Для случая "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;
    }
}

1 Ответ

0 голосов
/ 30 сентября 2018

Я думаю, что гораздо лучше инкапсулировать логику меню в отдельный класс и инкапсулировать всю логику в нем.Более того, логика для каждого пункта меню должна быть заключена в отдельный метод.

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;
    }

}

PS Лично я стараюсь избегать использования switch.Это не моя рекомендация, просто обратите внимание.Я думаю, что если ... еще, если это более читабельно и без проблем.

...