Java的in.nextInt()和in.nextLine()方法的具体内涵
问题
先用nextInt()再用nextLine()不会有接收字符串的效果。错误示范代码如下:
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生年龄:");
int age = sc.nextInt();
System.out.println("请输入学生姓名:");
String name = sc.nextLine();
原理
首先,Scanner是一个扫描器,它扫描数据都是去内存中一块缓冲区中进行扫描并读入数据的,而我们在控制台中输入的数据也都是被先存入缓冲区中等待扫描器的扫描读取。这个扫描器在扫描过程中判断停止的依据就是“空白符”,空格啊,回车啊什么的都算做是空白符。
nextInt()方法在扫描到空白符的时候会将前面的数据读取走,但会丢下空白符“\r”在缓冲区中,但是,nextLine()方法在扫描的时候会将扫描到的空白符一同清理掉。
了解了这两个方法特性和区别,就知道了上边的代码究竟是怎么回事,以及知道了解决的方法。像是上边的代码nextInt()方法之后在缓冲区中留下了“\r”,然后nextLine()方法再去缓冲区找数据的时候首先看到了“\r”,然后就把这个“\r”扫描接收进来,并在缓冲区内清除掉。其实,nextLine()方法是执行过的,并没有不执行。
解决办法
1、可以再nextInt()方法后面多加一句nextLine()方法专门用来取出缓冲区中留下的空白符。
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生年龄:");
int age = sc.nextInt();
sc.nextLine();//取出缓冲区空白符
System.out.println("请输入学生姓名:");
String name = sc.nextLine();
2、可以只用nextLine()方法,然后通过Integer类中的parseInt()方法解析成int数据。
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生年龄:");
String s = sc.nextLine();
int age = Integer.parseInt(s);
System.out.println("请输入学生姓名:");
String name = sc.nextLine();