next()与nextLine()的使用注意事项

今天练习的时候遇到了这个问题,发现这个很类似于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()
在这里插入图片描述

先来了解的函数:

  1. next()一定要读取到有效字符后才可以结束输入,没有输入有效字符之前,忽略空格,Tab键,以及enter;输入了有效字符以后,空格,Tab,enter都可以结束输入。在读取完后把光标放在读取数据的同一行,该数据的后面。所以next()所以无法得到带空格的字符串。
  2. nextLine()从第一次的结果我们可以知道它是可以支持输入空格隔开的字符串,其实它是读取整行的数据包括单词间的空格,到回车结束(也就是从开始读一整行,返回回车之前的字符),读取结束后,光标放在下一行开头。
  3. 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结束符过滤掉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章