import java.util.Scanner;
public class nextIntAndNextLine {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
//input your age
System.out.println("Please enter your age:");
int age = s.nextInt();
//为什么我们需要这一行?
s.nextLine();
//input your answer
System.out.println("You are " + age + " years old!");
System.out.println("Do you like being so old?");
String answer = s.nextLine();
}
}
如果我们将这一行注释掉,我们会发现下一个输入的nextLine,我们无法输入任何东西
为什么会出现这种情况呢?因为nextInt方法根据分隔符(回车)截取前面的int类型数值,把后面的字节继续 传递下去。
换句话说,当我们输入一个数字“10”,然后点回车,实际上我们输入的不是10,而是“10\n”
不过nextInt可不管那些,nextInt截取了其中他最想要的10,剩下的\n会被扔到之后的nextLine()读取。这么一来,nextLine()读到了一个回车键,他就自动结束输入,读取的内容是“”,什么都没读到就结束了。
如果还是觉得绕的话,可以记住这样一个诀窍,当使用nextInt(),next(),nextDouble(),nextFloat()等方法的时候
后面加上一行s.nextLine()即可。
别退出,还没完
那么问题又来了,s.nextLine()为什么又能解决这个问题?
我们得先了解以下两种方法的区别
nextLine()和nextInt()的区别在于:
还是用之前的例子。我们输入10,按回车,实际输入的是10\n
nextInt() 碰到回车\n就结束输入,但他不读取10\n,只读取了10,然后就读取结束,\n丢给后人处理。
nextLine() 碰到回车\n也就结束输入,但它会读取10\n,并且以其读取的回车符为结束。换句话说,就是它会读取回车符之前的所有内容,然后读取回车符,并把它处理掉。
那么nextInt方法后面要额外加一个nextLine()方法的理由:
生动形象一点,就是用nextLine帮忙nextInt擦屁股
用额外一行nextLine()来读取多出来的回车符\n并自己处理掉。
防止这个多出来的\n被下一个next方法读到。