【问题标题】:How to keep switch statement continuing in Java如何在 Java 中保持 switch 语句继续
【发布时间】:2020-04-12 03:24:35
【问题描述】:

我希望重复以下菜单:

选择一个选项

1 - 查找

2 - 随机播放

3 - 洗牌

这样当用户选择一个选项时(这将被执行),之后他们也可以选择其他选项。

问题:我的代码不断重复菜单。

import java.util.Scanner;

public class MainMenu {
    public static void main(String[] args) {
        int userChoice;
        userChoice = menu();
    }

    private static int menu() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Choose an Option");
        System.out.println("1 - FIND");
        System.out.println("2 - IN-SHUFFLE");
        System.out.println("3 - OUT-SHUFFLE");

        int choice = scanner.nextInt();
        boolean quit = false;
        do {
            System.out.println("Choose an Option");
            switch (choice) {
                case 1:
                    System.out.println("\n1 - FIND\n");
                    //Deck.findTop();
                    break;
                case 2:
                    System.out.println("\n2 - IN-SHUFFLE\n");
                    // call method
                    break;
                case 3:
                    System.out.println("\n3 - OUT-SHUFFLE\n");
                    // call method
                    break;
                default:
                    System.out.println("\nInvalid Option");
                    break;
            }
        }
        while (!quit);

        return choice;
    }

}

我不知道如何才能阻止它不断重复。

【问题讨论】:

  • 添加退出选项
  • 并将int choice = scanner.nextInt(); 放入循环中

标签: java while-loop switch-statement console-application infinite-loop


【解决方案1】:

试试这个。您只需要将退出移出循环并将选项和用户选择带入循环。

import java.util.Scanner;
public class Switchh {

static boolean quit = false;

public static void main(String[] args) {
    int userChoice;
    userChoice = menu();
}

private static int menu() {
    Scanner scanner = new Scanner(System.in);
    int choice;
    do {

        System.out.println("Choose an Option");
        System.out.println("1 - FIND");
        System.out.println("2 - IN-SHUFFLE");
        System.out.println("3 - OUT-SHUFFLE");
        choice = scanner.nextInt();
        System.out.println("Choose an Option");
        switch (choice) {
            case 1:
                System.out.println("\n1 - FIND\n");
                //Deck.findTop();
                break;
            case 2:
                System.out.println("\n2 - IN-SHUFFLE\n");
                // call method
                break;
            case 3:
                System.out.println("\n3 - OUT-SHUFFLE\n");
                // call method
                break;
            default:
                System.out.println("\nInvalid Option");
                quit = true;
                break;
        }
    }
    while (!quit);

    return choice;
}

}

【讨论】:

  • @hc_dev 似乎问题已修改,请查看已编辑的答案
【解决方案2】:

会发生什么?

  1. 用户的选择 (int choice = scanner.nextInt();) 在循环之前只询问一次。因此,choice 在进入循环之前已修复。
  2. 您的do {} while 仅循环执行某些代码的开关语句,基于用户的选择(实际上打印单个固定 选择)。用户没有机会在循环内更改它。
  3. 循环的控制变量boolean quit 永远不会在循环内更改,因此永远不会达到循环的退出条件quit == true
  4. 您向用户显示的菜单不包含任何退出选项4 - QUIT

总结:一旦用户输入一个选项 (1),程序就会陷入所谓的 无限循环 (3) 总是打印当前选项 (2) .即使在重新启动后,不知情的用户也没有机会退出,因为菜单都没有列出此选项 (4),choice = 4 也不会起作用,因为它不在 switch 的情况下 (3)。

解决问题

  1. 在循环内修改循环的控制变量:在额外的case 4: quit = true; break; 内设置quit = true
  2. 确保仅退出的分支将通过读取用户在循环中的选择来访问:将int choice = scanner.nextInt(); 放入do {} 中并直接放在switch 之前。
  3. 在您的菜单中添加一个选项,以便用户知道如何退出(例如4 - QUIT),并使用此选项(参见 1)
  4. 直接在读取用户选择之前显示循环内的菜单。

建议

首先设计循环:专注于退出!

  1. 使用while(exitCondition == false) {} 循环而不是do {} while(exitConfition == false),因为非常重要的exitCondition 会首先显示(对您的代码的每个读者),它可以控制和避免无限循环。因此,请记住将其设置在循环中!
  2. 保持循环内的代码行简短,并在顶部修改控制变量,而不是在嵌套块内。
  3. 在设计循环时(尤其是对于用户交互),请先做,然后使用伪代码(请参阅下面注释掉的行)。
    final static int QUIT_OPTION = 4;

    public static void main(String[] args) {
        int chosenOption = -1;
        while (chosenOption != QUIT_OPTION) {
            // showMenu();
            // chosenOption = readUsersChoice();   
            // executeOption(chosenOption);
            System.out.println("choosenOption: " = choosenOption); // for testing: see if choosenOption does change
            choosenOption = QUIT_OPTION; // while design: simulates a single loop
        }
    }

循环内的最后 2 行仅用于设计阶段,您将在其中测试单个循环(因此最终激活 QUIT_OPTION)。将注意力放在控制变量上:您的用户或程序是否能够以所需的方式更改它(因此调试println)?

分而治之:将任务/逻辑拆分成小的独立功能 上面的循环(在main 内)是第一个小而主要的逻辑部分。

循环内的第一个任务:“显示菜单”

    private static void showMenu() {
        System.out.println("Options - Main Menu");
        System.out.println("1 - FIND");
        System.out.println("2 - IN-SHUFFLE");
        System.out.println("3 - OUT-SHUFFLE");
        System.out.println("4 - QUIT");
        System.out.println("Choose from above Options (1-4) by typing the number followed by RETURN:");
    }

尽量保持这种方法的规模较小,专注于一项任务。如果可能的话,让他们也被隔离(与其他人)。因此,您可以分别测试(调用)它们并检查它们是否符合您的要求。

下一步:“读取用户的选择”

    private static int readUsersChoice() {
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();

        return choice;
    }

此方法需要特殊测试。试试如果用户输入一个字母会发生什么(例如Q,因为希望退出)。你在方法中捕捉到java.util.InputMismatchException了吗?

最后“选择的选项将被评估和执行”:

    private static void executeOption(int choice) {
        switch (choice) {
            case 1:
                System.out.println("\n1 - FIND\n");
                //Deck.findTop();
                break;
            case 2:
                System.out.println("\n2 - IN-SHUFFLE\n");
                // call method
                break;
            case 3:
                System.out.println("\n3 - OUT-SHUFFLE\n");
                // call method
                break;
            default:
                System.out.println("\nInvalid Option");
                break;
        }
    }

测试它,因为这里 - 基于一个选项 - 可以调用一些其他代码/方法(甚至循环)。您还可以添加case: QUIT_OPTION 并打印再见。

【讨论】:

    【解决方案3】:

    所选选项在整个循环中保持不变。您需要将 quit 设置为 true 才能退出循环。 我建议在 switch 语句中添加一个退出选项,您可以在其中执行此操作。

    为了能够更改选定的选项,您需要在循环内请求输入。

    Scanner sc = new Scanner(System.in);
    int choice;
    boolean quit = false;
    do {
      choice = sc.nextInt();
      switch (choice) {
        case 1:
          // case 1
          break;
        case 2:
          // case 2
          break;
        case 3:
          // case 3
          break;
        case 4:
          quit = true;
          break;
        default:
          // your default here
      }
    } while (!quit);
    

    【讨论】:

      【解决方案4】:

      您的代码中的一个问题是menu 方法返回一个选项,因此它既可以用于从控制台读取一个选项,也可以用于执行整个对话框,直到用户决定退出。后者更好恕我直言,因为它使菜单的显示接近switch statemenmt:

      private static void menu()
      {
          Scanner scanner = new Scanner(System.in);
      
          System.out.println("Choose an Option");
          System.out.println("1 - FIND");
          System.out.println("2 - IN-SHUFFLE");
          System.out.println("3 - OUT-SHUFFLE");
          System.out.println("4 - QUIT");
      
          boolean quit = false;
          do {
              System.out.println("Choose an Option");
              int choice = scanner.nextInt();
      
              switch (choice) {
                  case 1:
                      System.out.println("\n1 - FIND\n");
                      Deck.findTop();
                      break;
                  case 2:
                      System.out.println("\n2 - IN-SHUFFLE\n");
                      // call method
                      break;
                  case 3:
                      System.out.println("\n3 - OUT-SHUFFLE\n");
                      // call method
                      break;
                  case 4:
                      System.out.println("\n4 - QUIT");
                      quit = true;
                      break;
                  default:
                      System.out.println("\nInvalid Option");
                      break;
              }
          }
          while (!quit);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-25
        • 2011-05-16
        • 1970-01-01
        相关资源
        最近更新 更多