- 对于Scanner中 next() 和 nextLine()方法,有一个比较基础且受众很广的解释:
next()方法在读取内容时,会过滤掉有效字符前面的无效字符,对输入有效字符之前遇到的空格键、Tab键或Enter键等结符,next()方法会自动将其过滤掉;只有在读取到有效字符之后,next()方法才将其后的空格键、Tab键或Enter键等视为结束符;所以next()方法不能得到带空格的字符串。
nextLine()方法字面上有扫描一整行的意思,它的结束符只能是Enter键,即nextLine()方法返回的是Enter键之前没有被读取的所有字符,它是可以得到带空格的字符串的。
- 但是这种简单的区别不足以解释我所遇到的问题:
import java.util.Scanner;
public class Demo1 {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.println("系统开始运行:");String name1 = input.next();System.out.println("next方法已运行");String name2 = input.nextLine();System.out.println("nextLine方法已运行");System.out.println(name1);System.out.println(name2+"nextLine方法");}
}
运行结果:
红线为光标所停留位置,可以看到 nextLine() 方法的运行直接被跳过了,没有获取到值
- 此时,调换一下 next() 和 nextLine()顺序:
import java.util.Scanner;
public class Demo1 {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.println("系统开始运行:");String name2 = input.nextLine();System.out.println("nextLine方法已运行");String name1 = input.next();System.out.println("next方法已运行");System.out.println(name1);System.out.println(name2+"nextLine方法");}
}
运行结果:
可以看到 nextLine() 放在 next() 之前就可以正常运行,同时 next() 方法并没有受到 nextLine() 的影响,为什么?
- 原因:
next() 扫描结束标记是:空格,tab键,回车符
不会过滤回车符
nextLine() 从左往右扫描数据,扫描结束标记是:回车符
过滤回车符
Scanner是一个扫描器,我们录入到控制台的数据,先存到缓存区等待读取,当 next() 在 nextLine() 之前时,没有过滤掉的回车符被 nextLine() 读取后直接运行了,读取结果是空行,返回空数据。。。。。。