对java的Scanner类的next开头的相关类有点纠结,看了一些博客大致懂了,整理下
代码事例直接参考了这位大佬的
https://blog.csdn.net/long71751380/article/details/9400835
1. 总的原理
以一段代码为例,scanner类
import java.util.Scanner;
public class Next {
public static void main(String[] args) {
String s1, s2;
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个字符串:");
s1 = sc.nextLine();
System.out.println("请输入第二个字符串:");
s2 = sc.next();
System.out.println("输入的字符串是:" + s1 + " " + s2);
}
}
1.1 new Scanner(System.in)
以控制台为例,此时会提供控制台输入,输入的字符会到某缓存通道中A(也不知道专业名词叫什么)
继续执行后面的代码
1.2 sc.nextLine()
此时会从缓存通道A中开始读取数据,通道A中的游标(也不知道专业名词叫什么)初始位置为缓存通道A最前面,此时程序运行到nextLine(),该方法会做两件事情。
一是读取起始符到结束符中的数据,二是游标移动到结束符后(相当于把这段数据清空)
image.png
运行结果
(该部分引用那个博主例子start)
请输入第一个字符串:
ss
请输入第二个字符串:
dd
输入的字符串是:ss dd
但如果把程序改一下, s1=sc.next(); s2=sc.nextLine();
import java.util.Scanner;
public class Next {
public static void main(String[] args) {
String s1, s2;
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个字符串:");
s1 = sc.next();
System.out.println("请输入第二个字符串:");
s2 = sc.nextLine();
System.out.println("输入的字符串是:" + s1 + " " + s2);
}
}
运行结果
请输入第一个字符串:
ss
请输入第二个字符串:
输入的字符串是:ss
可以看到,nextLine()自动读取了被next()去掉的Enter作为他的结束符,所以没办法给s2从键盘输入值。经过验证,我发现其他的next的方法,如double nextDouble() , float nextFloat() , int nextInt() 等与nextLine()连用时都存在这个问题,解决的办法是:在每一个 next()、nextDouble() 、 nextFloat()、nextInt() 等语句之后加一个nextLine()语句,将被next()去掉的Enter结束符过滤掉。例如上面的程序改写为:
import java.util.*;
public class Next {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入第一个字符串");
String s1=sc.next();
sc.nextLine();
System.out.println("请输入第二个字符串");
String s2=sc.nextLine();
System.out.println("输入的字符串是"+s1+" "+s2);
}
}
(该部分引用那个博主例子end)