Scanner是一个扫描获取用户输入的一个类,查看类的源码,可以看出基本数据类型除了char都可以进行输入。但是呢,用于接收用户输入字符串的方式有next()和nextLine()两种。
在了解区别之前,我们先看一段代码,示例如下:
/*
在main方法中执行
*/
Scanner scanner = new Scanner(System.in);
System.out.println("请输入姓名:");
String name = scanner.nextLine();
System.out.println("请输入年龄:");
int age = scanner.nextInt();
System.out.println("请输入班级:");
String Class = scanner.nextLine();
System.out.println("您的个人信息如下:(请确认自己信息)");
System.out.println("姓名:"+name);
System.out.println("年龄:"+age);
System.out.println("身份ID:"+Class);
从上可以看出,在输入年龄之后,我们还没来的及输入班级,本次用户输入就已经自动结束。
带着这个问题,我们一探究竟
2.1:探究next()和nextLine()的区别
/*
在main方法中执行
*/
Scanner scanner = new Scanner(System.in);
System.out.println("请输入文字:");
String str1 = scanner.nextLine();
System.out.println("请再次输入文字:");
String str2 = scanner.next();
System.out.println("nextLine方式输出的字符串:"+str1);
System.out.println("next方式输出的字符串:"+str2);
看这次的输出结果:我们两次输入hello word,明显nextLine输出的结果可以含有空格,也就是说nextLine是以回车键作为输入的结束符号;
而next输出的则没有空格,就可以理解为next输入的字符串不能含有空格,并且,它是以空格、Tab、回车作为输入的结束符号,三者谁在前就先以谁为结束符号。
问:现在我们回到头部看第一段代码,我们就能发现,为什么还没等用户输入班级,就直接结束掉输入了呢?
答:因为nextLine他读取到我们在输入年龄之后的回车键来作为它的值。
出现这种问题,我们要如何解决呢?
两种解决方法:
第一种方法:
既然next来读取上一次回车作为它的值,那我们就在代码中优先读取一下回车,代码展示
/*
在main方法中运行
*/
Scanner scanner = new Scanner(System.in);
System.out.println("请输入姓名:");
String name = scanner.nextLine();
System.out.println("请输入年龄:");
int age = scanner.nextInt();
//在这里我们优先让他接收我们输入年龄之后的回车
scanner.nextLine();
System.out.println("请输入班级:");
String Class = scanner.nextLine();
System.out.println("您的个人信息如下:(请确认自己信息)");
System.out.println("姓名:"+name);
System.out.println("年龄:"+age);
System.out.println("班级:"+Class);
完美解决!但是,这样虽然问题解决了,每次都要多谢一行代码,我们作为程序员就会很反感,有什么方法能让我不写这一行代码来解决呢?
当然有。自己动手写一个封装方法,通过把nextLine接收用户输入的的字符串,我们当作一个方法封装起来不就好了嘛。你们不想动手我来,直接拿走就行。代码如下:
package ymy.circulation.test;
import java.util.Scanner;
/**
* 通过输入nextLine字符串当作一个方法进行封装起来,然后调用这个方法
*/
public class ScannerDemo {
private static Scanner extracted() {
return new Scanner(System.in);
}
public static int getInt() {
Scanner scanner = extracted();
return scanner.nextInt();
}
public static String getString() {
return extracted().nextLine();
}
}
然后我们来测试类测试一下看看可行与否:
package ymy.circulation.test;
public class Text {
public static void main(String[] agrs) {
System.out.println("请输入姓名:");
String name = ScannerDemo.getString();//直接调用我们的封装方法
System.out.println("请输入年龄:");
int Class = ScannerDemo.getInt();
//scanner.nextLine();//读取回车注释掉了哦
System.out.println("请输入班级:");
String Shenfen = ScannerDemo.getString();
System.out.println("您的个人信息如下:(请确认自己信息)");
System.out.println("姓名:"+name);
System.out.println("年龄:"+Class);
System.out.println("班级:"+Shenfen);
}
}
看结果
看来我们这个办法也是完美解决,可以看出读取回车作为自己的结果问题已经解决,亲测可行!
陪大家一起复盘他们两个的区别:
next() | nextLine() |
不能读入含空格字符串;以空格、Tab、回车作为输入的结束符号 | 可以读入空格,以回车作为结束符号 |
不会读取回车作为值 | 会读取回车作为它的值 |
Ok,以上就是对两者的区别做了说明,还有不懂的话建议多敲两遍我上面的代码,还有不懂可以留言,转载请注明出处,祝大家工作顺心,文章有什么不足欢迎留言批评!