小编典典

扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

all

我正在使用这些Scanner方法nextInt()nextLine()读取输入。

它看起来像这样:

System.out.println("Enter numerical value");    
int option;
option = input.nextInt(); // Read numerical value from input
System.out.println("Enter 1st string"); 
String string1 = input.nextLine(); // Read 1st string (this is skipped)
System.out.println("Enter 2nd string");
String string2 = input.nextLine(); // Read 2nd string (this appears right after reading numerical value)

问题是输入数值后,第一个input.nextLine()被跳过,第二个input.nextLine()被执行,这样我的输出是这样的:

Enter numerical value
3   // This is my input
Enter 1st string    // The program is supposed to stop here and wait for my input, but is skipped
Enter 2nd string    // ...and this line is executed and waits for my input

我测试了我的应用程序,看起来问题在于使用input.nextInt(). 如果我删除它,那么两者string1 = input.nextLine()string2 = input.nextLine()将按照我的意愿执行。


阅读 182

收藏
2022-03-01

共1个答案

小编典典

这是因为该Scanner.nextInt方法不会读取通过按“Enter”创建的输入中的
换行符,因此在读取该
换行符Scanner.nextLine后调用返回。
__

当您使用Scanner.nextLineafterScanner.next()或任何Scanner.nextFoo方法(除了nextLine它自己)时,您会遇到类似的行为。

解决方法:

  • 要么Scanner.nextLine在每个之后打一个电话,Scanner.nextInt要么Scanner.nextFoo消耗该行的其余部分,包括 换行符

    int option = input.nextInt();
    

    input.nextLine(); // Consume newline left-over
    String str1 = input.nextLine();

  • 或者,更好的是,通读输入Scanner.nextLine并将您的输入转换为您需要的正确格式。例如,您可以使用Integer.parseInt(String)方法转换为整数。

    int option = 0;
    

    try {
    option = Integer.parseInt(input.nextLine());
    } catch (NumberFormatException e) {
    e.printStackTrace();
    }
    String str1 = input.nextLine();

2022-03-01