Java Scanner nextLine()有时会跳过输入

Java Scanner nextLine()有时会跳过输入,java,java.util.scanner,Java,Java.util.scanner,这是我的密码 Scanner keyboard = new Scanner(System.in); System.out.print("Last name: "); lastName = keyboard.nextLine(); System.out.print("First name: "); firstName = keyboard.nextLine(); System.out.print("Email address: "); emailAddress = keyboard.nex

这是我的密码

Scanner keyboard = new Scanner(System.in);

System.out.print("Last name: ");
lastName = keyboard.nextLine(); 

System.out.print("First name: ");
firstName = keyboard.nextLine();

System.out.print("Email address: ");
emailAddress = keyboard.nextLine();

System.out.print("Username: ");
username = keyboard.nextLine();
它输出这个

Last name: First name: 
基本上,它跳过了让我输入
lastName
,直接进入
firstName
的提示

但是,如果我使用
keyboard.next()
而不是
keyboard.nextLine()
,它可以正常工作。你知道为什么吗?

让我猜猜——在试图获取姓氏的过程中,你还没有看到使用扫描器的代码。在这种尝试中,您没有处理行尾标记,因此它处于悬空状态,只会被对
nextLine()
的调用吞没,您尝试在那里获取
lastName

例如,如果您有:

Scanner keyboard = new Scanner(System.in);
System.out.print("Enter a number: ");
int number = keyboard.nextInt();  // dangling EOL token here
System.out.print("Last name: ");
lastName = keyboard.nextLine(); 
你会有问题的

一种解决方案是,每当您让EOL令牌悬空时,通过调用
keyboard.nextLine()
将其吞下

e、 g

Scanner keyboard = new Scanner(System.in);
System.out.print("Enter a number: ");
int number = keyboard.nextInt();  
keyboard.nextLine();  // **** add this to swallow EOL token
System.out.print("Last name: ");
lastName = keyboard.nextLine(); 

这正是发生的事情。谢谢@杰森:不客气。我们大多数人在开始使用扫描仪时都会遇到这个问题。另一种可能的解决方案是使用一个扫描仪获取行,然后使用另一个扫描仪处理行中的文本,这很好,只要在使用后关闭任何扫描仪(链接到System.in的扫描仪除外)。