如何正确清除扫描仪以防止输入循环额外时间?

问题描述 投票:0回答:1

我正在为一家宠物店制作基本菜单,在我编写的程序中,您可以拥有多只宠物并从这家商店购买。我在命令行上运行此菜单并尝试使用

scan.nextInt()
获取用户输入,发生的情况是菜单重复了第二次,但是在第二次循环中输入任何内容似乎什么都不做,程序继续进行。互联网搜索建议我需要使用
scan.nextLine()
清除扫描仪,但这似乎也无法解决问题。如果您需要更多代码,请告诉我,但这应该足够了,我是编程新手,所以请保持温柔


    public Pet showMenu()
    {

        
        Scanner scan = new Scanner(System.in);
        int result = 10;
            
        while(true)
        {

            System.out.println("Welcome to the pet store: ");
            System.out.println("Please pick a pet ");
            for (int i = 0; i < availablePets.size(); i++)
            {
                System.out.println(i + ")");
                availablePets.get(i).printStats();
                System.out.println();

            }//End for
            try
            {

                System.out.println("Which pet would you like? (Type any other number to quit)");
                result = scan.nextInt(); 
                scan.nextLine();    
                if (result >= 0 && result <= 3)
                {
        
                    Pet tempPet = availablePets.get(result);
                    availablePets.remove(result);
                    return tempPet;
                }
                else
                {

            
                    Pet quitObj = new Pet("Quit");
                    return quitObj;     
                

                }

            }
            catch (Exception e)
            {

                System.out.println(e.getMessage());

            }
        }
      }

Output

java oop while-loop menu java.util.scanner
1个回答
0
投票

看起来问题可能与在 scan.nextInt() 之后使用 scan.nextLine() 有关。原因是 scan.nextInt() 仅从输入中读取整数值并将换行符留在输入缓冲区中。然后,当您调用 scan.nextLine() 清除缓冲区时,它会读取这个换行符并停止,因此会跳过下一个输入。

要解决此问题,您可以在 scan.nextInt() 之后添加对 scan.nextLine() 的额外调用以清除换行符。以下是如何修改代码的示例:

System.out.println("Which pet would you like? (Type any other number to quit)");
result = scan.nextInt();
scan.nextLine(); // add this line to clear the newline character
if (result >= 0 && result < availablePets.size())
{
    // code for selecting a pet
}
else
{
    // code for quitting
}

通过此修改,对 scan.nextLine() 的额外调用将从输入缓冲区中清除换行符,并且后续输入应该按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.