Scanner nextLine()偶尔会跳过输入

jsa*_*san 4 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.nextLine();

System.out.print("Username: ");
username = keyboard.nextLine();
Run Code Online (Sandbox Code Playgroud)

它输出这个

Last name: First name: 
Run Code Online (Sandbox Code Playgroud)

基本上它跳过让我进入lastName并直接进入提示firstName.

但是,如果我使用keyboard.next()而不是keyboard.nextLine(),它工作正常.有什么想法吗?

Hov*_*els 8

让我猜一下 - 你没有显示使用上面尝试获取lastName的扫描器的代码.在那次尝试中,你没有处理行尾令牌,所以它就是悬空,只是被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(); 
Run Code Online (Sandbox Code Playgroud)

你会遇到问题.

一个解决方案,每当你离开EOL令牌悬空时,通过调用吞下它keyboard.nextLine().

例如,

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(); 
Run Code Online (Sandbox Code Playgroud)

  • @jsan:不客气.我们大多数人在开始使用Scanner时偶然发现了这个问题.另一种可能的解决方案是使用一个扫描仪来获取线条,然后使用另一个扫描线来处理线条中的文本,这很好,只要您在使用后关闭任何扫描仪(除了链接到System.in的扫描仪之外). (2认同)