【问题标题】:Exiting a sequence of user inputs without checking for the exit symbol ("--exit") after every input退出用户输入序列而不在每次输入后检查退出符号 (\"--exit\")
【发布时间】:2022-12-13 11:34:29
【问题描述】:

我正在编写一个程序,我正在使用用户输入来填充一个类中的多个字段。我正在使用扫描仪从命令行获取用户的输入。由于它是一个命令行程序,我希望用户能够在任何时候编写“--exit”以返回主“菜单”。

有没有一种方法可以避免重复的 if 语句来实现这一点?它不必使用扫描仪来获取输入。另一种方法也可以,只要它从终端获取输入即可。

      System.out.println("Write --exit to return to the menu\n");
      System.out.println("Enter the id: ");
      String input = scanner.next();
      if (input.equals("--exit")) {
        return;
      }
      final String id = input;

      System.out.println("Enter the description: ");
      input = scanner.next();
      if (input.equals("--exit")) {
        return;
      }
      final String description = input;

      System.out.println("Enter the price: ");
      input = scanner.next();
      if (input.equals("--exit")) {
        return;
      }
      final int price = Integer.parseInt(input);
      
      // continues below

【问题讨论】:

    标签: java user-input


    【解决方案1】:

    像您现在这样重复 if 语句可能是实现预期效果的最简单/最直接的方法,即使它们看起来很丑陋或看起来可以重构以避免重复代码。

    即使您制作了一个“handleUserInput”方法并将其用于所有 3 个问题,您也不能将“if(input.equals("--exit")) return;”在那里行,因为 return 语句只会退出内部方法而不会结束外部方法(AFAIK 没有办法做到这一点)。您可以使用类似“if(input.equals("--exit")) goBackToMenu();”的内容相反,但这是一个糟糕的解决方案,因为每次以这种方式循环时,它都会不断增加堆栈大小。在大多数用例中可能不是问题,但这是不好的做法。

    【讨论】:

      【解决方案2】:

      我会让扫描仪在用户输入“--exit”时抛出自定义异常。我还会让扫描仪发出提示,并对输入的类型使用不同的 next() 方法;这样您的代码将如下所示:

      public Form enterForm() throws ReturnToMenuException {
          System.out.println("Write --exit to return to the menu
      ");
          final String id = scanner.nextString("Enter the id: ");
          final String desc = scanner.nextString("Enter the description: ");
          final int price = scanner.nextInt("Enter the price: "));
            .
            .
            .
      
        return new Form(id, desc, price...);
      }
      

      【讨论】:

        最近更新 更多