今天练习的时候遇到了这个问题,发现这个很类似于C里边的scanf("%s")读取缓存区的过程。记录一下
代码:
package exception_use;
import java.util.Scanner;
public class Test1 {
public static void main(String[]args){
Scanner sc = new Scanner(System.in);
System.out.println("---学生管理系统---\n学生录入信息");
String name = "";//name
int age = 0;
String sex="";//性别
try{
System.out.println("请输入学生的姓名:");
name = sc.nextLine();
System.out.println("请输入学生的年龄:");
age = sc.nextInt();
System.out.println("请输入学生的性别:");
sex = sc.nextLine();
}catch (Exception e){
e.printStackTrace();
System.out.println("输入有误");
}
System.out.println("学生的姓名是"+name+"学生的年龄是"+age+"学生的性别是:"+sex);
}
}
请注意14行和18行,我这里使用了两个nextLine()函数来读取字符串。
运行结果:
输入Amy we enter
输入 18 enter
我们把第一个nextLine()修改为next()
运行结果:
输入的是 Amy enter
然后输入 18 enter
现在把两个nextLine修改为next()
先来了解的函数:
- next()一定要读取到有效字符后才可以结束输入,没有输入有效字符之前,忽略空格,Tab键,以及enter;输入了有效字符以后,空格,Tab,enter都可以结束输入。在读取完后把光标放在读取数据的同一行,该数据的后面。所以
next()所以无法得到带空格的字符串。
- nextLine()从第一次的结果我们可以知道
它是可以支持输入空格隔开的字符串
,其实它是读取整行的数据包括单词间的空格,到回车结束(也就是从开始读一整行,返回回车之前的字符),读取结束后,光标放在下一行开头。 - nextInt()只读取整数类型数据, nextInt()在读取完输入后把光标放在读取数据的同一行,该数据的后面。
java8 开发手册:
1.string next()
2.String nextLine()
3.nextInt()
原因分析:
1.当两个都是nextLine(第一次的结果)
输入Amy we enter,第一个nextLine读取到字符串Amy we;然后enter结束输入,光标指向下一行了,这个时候输入18 enter,nextInt读取18,光标放在了enter前面,到nextLine()的时候,自然直接读取了enter,返回的是空串,即sex="",结束,打印结果。
修改一下代码验证:
输入Amy we enter18enter
name=Amy we;age=18;sex=“”;
2.当第一个是next(),第二个是nextLine()时(第二次结果)
输入Amy enter,第一个next()读取了Amy,enter结束,然后把光标放在Amy后面enter前,所以输入了Amy;我们输入18 enter,此时相当于有enter 18 enter
给nextInt匹配,匹配了18,光标放在了enter前面
,到nextLine()的时候,自然直接读取了enter,返回空串。结束,打印结果。
修改代码并验证:
输入enter enter enter 2 enter enter entr 2enter
name=2;age=2;sex=“”;
3.两个都改为next()后,输入Amy enter,那么next()读取到了Amy,光标放在enter,我们输入18 enter,则nextInt匹配enter 18 enter得到18,光标放在最后的enter前面,这个时候enter不是有效的输入,next()就会继续等,我们输入了wome enter,可以了,读取women,光标放在enter结束。
验证:
结论
当我们使用该类型的数据多次输入时,应该自己要权衡在每一个 next()、nextDouble() 、 nextFloat()、nextInt() 等语句之后是否要加一个nextLine()语句,将被next()去掉的Enter结束符过滤掉。