0

程序在 main 中使用 while 循环菜单来请求用户命令:

public static void main(String[] args)throws Exception
{
    Boolean meow = true;

    while(meow)
    {
        System.out.println("\n  1. Show all records.\n"
            + "  2. Delete the current record.\n"
            + "  3. Change the first name in the current record.\n"
            + "  4. Change the last name in the current record.\n"
            + "  5. Add a new record.\n"
            + "  6. Change the phone number in the current record.\n"
            + "  7. Add a deposit to the current balance in the current record.\n"
            + "  8. Make a withdrawal from the current record if sufficient funds are available.\n"
            + "  9. Select a record from the record list to become the current record.\n"
            + " 10. Quit.\n");
        System.out.println("Enter a command from the list above (q to quit): ");
        answer = scan.nextLine();
        cmd.command(answer);
        if(answer.equalsIgnoreCase("10") || answer.equalsIgnoreCase("q"))
        {
            meow = false;
        }

    }
}

如果您选择的命令实际上都不是菜单上的命令,则会发生这种情况:

else
        {
            System.out.println("Illegal command");
            System.out.println("Enter a command from the list above (q to quit): ");
            answer = scan.nextLine();
            command(answer);
        }

每当我添加一个新人或使用任何需要我按回车键完成输入值的命令时,我都会得到 else 语句,然后是常规命令请求。

所以它看起来像:

Enter a command from the list above (q to quit): 
Illegal command
Enter a command from the list above (q to quit): 

当这件事发生时。

不会在这里发布我的完整代码,我害怕它,因为它太多了。取而代之的是它们的粘贴箱。

有谁知道为什么会这样?

4

2 回答 2

1

问题是类似的东西Scanner::nextDouble不读取换行符,所以下一个Scanner::nextLine返回一个空行。

替换所有出现的Scanner::nextLinewithScanner::next应该可以解决它。

您也可以Scanner::nextLine在最后一个非nextLine下一个方法之后执行一个,但这有点混乱。

我建议的其他一些事情:

  1. scan.useDelimiter("\n");在程序的开头添加,在一行中添加空格进行测试,你会明白为什么需要这样做。

  2. 更改printlnprint,因此可以在同一行输入命令。IE:

    改变

    System.out.println("Enter a command from the list above (q to quit): ");`
    

    System.out.print("Enter a command from the list above (q to quit): ");
    
  3. 改变这个:

    else
    {
        System.out.println("Illegal command");
        System.out.println("Enter a command from the list above (q to quit): ");
        answer = scan.nextLine();
        command(answer);
    }
    

    到:

    else System.out.println("Illegal command");
    

    您将再次打印菜单,但您将避免不必要的递归。避免再次打印菜单很容易。

  4. 最好在运行之前command检查退出(然后您可以删除该签入command)。

    System.out.println("Enter a command from the list above (q to quit): ");
    answer = scan.nextLine();
    if (answer.equalsIgnoreCase("10") || answer.equalsIgnoreCase("q"))
        meow = false;
    else
        cmd.command(answer);
    
  5. 更改BooleanbooleanBoolean是 的包装类boolean,在这种情况下不需要它。

于 2013-03-28T10:46:34.683 回答
0

也许它\n在 while 循环结束时和再次输入之前留在缓冲区中。也许

while(meow)

{
  scan.nextLine();

这可以帮助删除它。

于 2013-03-28T10:44:40.990 回答