用户输入“nextLine”和“nextInt”顺序



下面是两个脚本,它们只是要求用户输入的顺序不同。脚本#1可以工作,而脚本#2不能像预期的那样工作。在脚本#1中,我先问name问题,然后问age问题。在脚本#2中,我先问age问题,然后问name问题。

脚本#1 (works):

import java.util.Scanner;
public class Example2 {
    public static void main(String[] args) {
        // Initiate a new Scanner
        Scanner userInputScanner = new Scanner(System.in);
        // Name Question
        System.out.print("nWhat is your name? ");
        String name = userInputScanner.nextLine();
        // Age Question
        System.out.print("How old are you?");
        int age = userInputScanner.nextInt();
        System.out.println("nHello " + name + ". You are " + age
                + " years old");
    }
}

脚本#2(不工作):

import java.util.Scanner;
public class Example2 {
    public static void main(String[] args) {
        // Initiate a new Scanner
        Scanner userInputScanner = new Scanner(System.in);
        // Age Question
        System.out.print("How old are you?");
        int age = userInputScanner.nextInt();
        // Name Question
        System.out.print("nWhat is your name? ");
        String name = userInputScanner.nextLine();

        System.out.println("nHello " + name + ". You are " + age
                + " years old");
    }
}
在脚本#2中

,用户输入age后,他/她得到以下打印到控制台:

What is your name? 
Hello . You are 28 years old

然后脚本结束,不允许他/她输入name

我的问题:为什么脚本#2不起作用?我该怎么做才能让脚本#2工作(同时保持输入的顺序)

您必须在读取年龄后消耗EOL(行尾):

    System.out.print("How old are you?");
    int age = userInputScanner.nextInt();
    userInputScanner.nextLine();

    // Name Question
    System.out.print("nWhat is your name? ");
    String name = userInputScanner.nextLine();

如果你不这样做,EOL符号将在String name = userInputScanner.nextLine();处被消耗,这就是为什么你不能输入它。

当你读取一行时,它会读取整行直到末尾。

当你读取一个数字时,它只读取数字,它不读取行尾,例如,除非你再次调用nextInt(),在这种情况下,它将把新行作为空白读取。

简而言之,如果您希望输入忽略数字之后的任何内容,则写入

int age = userInputScanner.nextInt();
userInputScanner.nextLine(); // ignore the rest of the line.

在您的情况下,如果您没有输入任何内容,您的nextLine()将读取数字或空字符串后面的文本。

nextInt()方法将不使用来自输入流的回车。你需要自己消耗它。

import java.util.Scanner;
public class Example2 {
    public static void main(String[] args) {
        // Initiate a new Scanner
        Scanner userInputScanner = new Scanner(System.in);
        // Age Question
        System.out.print("How old are you?");
        int age = userInputScanner.nextInt();
        // consume carriage return
        userInputScanner.nextLine();
        // Name Question
        System.out.print("nWhat is your name? ");
        String name = userInputScanner.nextLine();

        System.out.println("nHello " + name + ". You are " + age
                + " years old");
    }
}

如果用户输入一个数字(比如21),实际输入是:"21n"。

您需要跳过"n",并额外调用nextLine:

// Age Question
System.out.print("How old are you?");
int age = userInputScanner.nextInt();
userInputScanner.nextLine(); // skip "n"

最新更新