关于next(),nextLine(),nextInt()在使用中的问题总结
一、概念
(1)、next()方法在缓冲区中遇到空格键、Tab键和回车符等空白字符时会将空白字符前的数据读取走,而空白字符还留在缓冲区中。
(2)、nextInt()在获取整数的过程中,若遇到空格键、Tab键和回车符等空白字符时,会把空白字符前面的数据取走,但并不处理后面的空白符(和next()方法类似)
(3)、nextLine()方法在缓冲区中读取一行数据,这行数据以回车符为结束符,而且它会将包括Enter键在内的数据取走。
二、遇到的问题
问题:
Java nextLine()函数之前如果使用了类似nextInt()的函数,Java nextLine()函数会失效
代码如下:
Scanner input = new Scanner(System.in);
int m = input.nextInt();
String strs1 = input.nextLine();
int n = input.nextInt();
System.out.println(m);
System.out.println(strs1);
System.out.println(n);
输入如下:
1
abc
2
错误如下:出现这样的错误:
原因:
(1)、在nextInt()在获取整数的过程中,若扫描到“空白字符(空格键、Tab键和回车符等)”,会把“空白字符”前面的数据取走,但并不处理后面的空白符;
(2)、到nextLine()运行时,则会把这个空白字符读进去,并且一旦扫描到空白字符,扫描就结束了,nextLine()就运行完了,只读取了一个空白符。(3)、但这还不至于报错,如果这个nextLine后面还有其他函数,比如nextInt(),就会导致nextInt()读取到nextLine()本应该读取的字符,导致报错
解决方案:
方案一(稳定):
用两次nextLine(),第一个nextLine()接收空白符号(空格键、Tab键和回车符等),第二个nextLine()接收数据
Scanner input = new Scanner(System.in);
int m = input.nextInt();
input.nextLine();// 用来接收“\n”
String strs1 = input.nextLine();
int n = input.nextInt();
System.out.println(m);
System.out.println(strs1);
System.out.println(n);
方案二(需注意):
用next()代替nextInt()
Scanner input = new Scanner(System.in);
int m = input.nextInt();
String strs1 = input.next();
int n = input.nextInt();
System.out.println(m);
System.out.println(strs1);
System.out.println(n);
需注意: next()不能得到带空格的字符串
方案三(不稳定):
new两个Scanner,第一个用于接收nextInt(),第二个用于接收nextLine()
Scanner input = new Scanner(System.in);
Scanner scan = new Scanner(System.in);
int m = input.nextInt();
String strs = scan.nextLine();
int n = input.nextInt();
System.out.println(m);
System.out.println(strs);
System.out.println(n);
在我查阅资料的过程中,发现方案三有瑕疵,好像会因为第二次new一个新的Scanner而中断System.in之类的
欢迎各位补充方案三