【问题标题】:System.out.println() printing twice during while-loopSystem.out.println() 在 while 循环期间打印两次
【发布时间】:2015-01-09 00:38:23
【问题描述】:

我创建了一个 while 循环来为我的程序创建一个菜单,它会一直循环直到用户在控制台中输入“退出”。我的问题是,每当我在控制台中输入“Transfer”时,if 语句都会完美运行,但是当它返回到循环的开头时,System.out.println(); 消息会打印两次而不是一次。任何其他选项都不会发生这种情况。

代码:

int x = 0;
while(x != 1) {
    System.out.println("To transfer funds, please type 'Transfer'\n" //Typical message
                + "To list recent transactions, please type 'Recent'\n"
                + "To display account details, please type 'Details'\n"
                + "To quit the application, please type 'Quit'");

    String Option1 = "Transfer"; //Variables
    String Option2 = "Recent"; 
    String Option3 = "Details";
    String Option4 = "Quit";
    String Menu = ConsoleInput.nextLine();

    if (Menu.equals(Option1)) {
            //Statements
    } else if(Menu.equals(Option2)){
            //Statements
    } else if(Menu.equals(Option3)){
            //Statements
    } else if(Menu.equals(Option4)){
            //End statement
            x++;
    }
}

编辑:你们中的一些人在评论最后一个 else 语句中 x 的增量,并说它应该放在 else 语句之外。之所以存在,是因为当用户在控制台中输入“退出”时,它将退出循环,如果将其放在 else 语句之外,那么用户将无法访问其他选项。

编辑 2(解决方案):我终于解决了这个问题。原来它是 if 语句中的扫描仪语句。我应该向大家展示完整的代码,但我认为这只是 if-else-statements 本身。

【问题讨论】:

  • 您的代码对我来说很好用。此外,您可能不应该使用int x 作为停止标志。更清晰的解决方案类似于boolean stop = false; while (!stop) { ... if (stopConditon) stop=true;}
  • 我试用了您的示例,它看起来不错。问题必须在您的“转移”语句中。另外,您是否考虑过使用 break 语句而不是取值 0 或 1 的变量?还是在其他方面很重要?
  • @lared 否。这样做将终止循环
  • @lared 我认为 OP 使用 x 作为控制流变量。 (x++ 代替 break)。否则“循环”将自动退出
  • 快速注释——Java 约定声明变量名是驼峰式,而不是标题式。你的Menu 应该是menu,你的ConditionX 应该是conditionXConsoleInput 应该是consoleInput

标签: java if-statement while-loop


【解决方案1】:

需要注意的几点:

  1. 您可能应该Menu.equalsIgnoreCase(Option1) 等。
  2. 你应该把x的增量放在while循环之后。除非您键入 End,否则您永远不会增加 x。

我认为你真的想要更多类似的东西

private static String[] options = {"Transfer","Recent","Details","Quit"};
private static int C_Transfer = 0;
private static int C_Recent = 1;
private static int C_Details = 2;
private static int C_Quit = 3;
private static int[] optionCase = {C_Transfer, C_Recent, C_Details,C_Quit);
private String menu;
private String message = "To transfer funds, please type 'Transfer'\n" //Typical message
                + "To list recent transactions, please type 'Recent'\n"
                + "To display account details, please type 'Details'\n"
                + "To quit the application, please type 'Quit'"

System.out.println(message);
menu = ConsoleInput.nextLine()
while (!menu.equalsIgnoreCase(options[C_Quit]) {
    int case = -1;
    for (int i=0, i < options.length; i++) {
      if (menu.equalsEgnoreCase(options[i]) {
          case = i;
          break;
      }
      switch (case) 
        case C_Transfer: {
           break;
        } 
        case C_Transfer: {
           break;
        } 
        case C_Transfer: {
           break;
        } 
        case C_Transfer: {
           break;
        }
        default: { 
           System.out.println(message);
        }
        Menu = ConsoleInput.nextLine();
     }
}

【讨论】:

  • “除非你输入 Quit”,否则你永远不会增加 x,这似乎是循环的重点:如果命令是“quit”,则增加 x,这将使外观条件为假。跨度>
  • OP 使用x++ 代替break
  • "在while循环后面加上x的增量"会自动退出
  • 只有当用户键入“退出”时,循环才会结束。 x++ 完全正确!
  • @AxelAmthor,“完全正确”有点牵强。如您所见,变量命名使很多人感到困惑。如果此代码由其他人维护,最好使用break 语句。
【解决方案2】:

这只发生在转移选项上,对吗?你能显示传输选项的代码吗?可能那里有打印消息的说明,所以当循环重新开始时,您会打印两次消息。

添加: 根据您的“转移代码”。似乎问题与 java.util.Scanner 的误用有关,但我自己不确定这个实用程序类。但是下面的修改代码对我有用:

public static void main(String[] args){
        java.util.Scanner ConsoleInput=new java.util.Scanner(System.in);
        String Menu;
        String message="To transfer funds, please type 'Transfer'\n" //Typical message
                + "To list recent transactions, please type 'Recent'\n"
                + "To display account details, please type 'Details'\n"
                + "To quit the application, please type 'Quit'";
        System.out.println(message);
                String Option1 = "Transfer"; //Variables
        String Option2 = "Recent"; 
        String Option3 = "Details";
        String Option4 = "Quit";
        while(!((Menu=ConsoleInput.nextLine()).equalsIgnoreCase(Option4))){
            if(Menu.equalsIgnoreCase(Option1)){
                System.out.println("You have selected transfer");
                System.out.println("How much would you like to transfer?");
                float deduction;
                float total = 2500;
                deduction = ConsoleInput.nextFloat();
                total = total - deduction;
                System.out.println("£" + total + " left in account. Transaction recorded.");
                //Fileoutput.println(sf.format(date) + " - £" + deduction + " taken from account. £" + total + " left in account.\n");  
                System.out.println(message);
            }else if(Menu.equalsIgnoreCase(Option2)){
                System.out.println("here is your balance...blah, blah, bbla\n");
                System.out.println(message);
            }else if(Menu.equalsIgnoreCase(Option3)){
                System.out.println("here is the details...blah, blah, bbla\n");
                System.out.println(message);
            }
        }
        System.out.println("Thanks");
    }

【讨论】:

猜你喜欢
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多