我做了这个程序,它打印了一个额外的东西

时间:2013-03-28 10:26:33

标签: java loops printing linked-list

程序在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): 

发生这种情况时。

不会在这里发布我的完整代码,我害怕它会导致它如此多。请改用它们的粘贴。

任何人都知道为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

问题是像Scanner::nextDouble之类的东西没有读取换行符,所以下一个Scanner::nextLine会返回一个空行。

Scanner::nextLine替换所有出现的Scanner::next应该修复它。

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

我建议的其他一些事情:

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

  2. println更改为print,因此可以在同一行输入命令。即:

    更改

    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. Boolean更改为booleanBooleanboolean的包装类,在这种情况下不需要。

答案 1 :(得分:0)

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

while(meow)

{
  scan.nextLine();

这可以帮助删除它。