Java的Scanner扫描器中nextInt()和nextLine()方法混用出现的问题及其解决方法
nextInt()和nextDouble()等系列方法和nextLine()一起使用会出现问题
class test05{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入数字:");
int key = sc.nextInt();
System.out.println("输入字符串");
String str = sc.nextLine();//如果换成sc.next()则正常运行
}
}
/*
输出结果:
输入数字:
1
输入字符串
Process finished with exit code 0
程序直接跳过字符串的输出,如果觉着不明显 可以写到死循环里自己感受一下
*/
为什么会出现这种问题呢?
nextLine():结束的标记为换行符 并且它可以获取前面的剩余下来的字符
再看看nextInt()方法的作用:遇到第一个有效字符(非空格,非换行符)是开始扫描,但是遇见第一个
分隔符或者结束符时(空格,enter,tab)结束扫描,获取扫描到的不含空格,换行的单个字符串,所以
它留下了一个换行符,然而呢这个换行符被nextLine()读取了,所以导致了字符串还没有输入就被
跳过了.解决办法在nextInt()方法下加一个nextLine()方法用来清空空白符.
修改后的代码如下
class test05{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入数字:");
int key = sc.nextInt();
sc.nextLine();
System.out.println("输入字符串");
String str = sc.nextLine();
}
}
/*
输入数字:
9
输入字符串
l
Process finished with exit code 0
*/
//这样也可以结局问题,重新new一个扫描器
class test05{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入数字:");
int key = sc.nextInt();
sc = new Scanner(System.in);
System.out.println("输入字符串");
String str = sc.nextLine();
}
}
或者使用next()也可以,看一下这俩个方法的具体区别
具体区别
next():该方法在读取内容时,会过滤掉有效字符前面的无效字符,对输入有效字符之前遇到的空格,Tab键或者Enter键等结束符,next()方法会自动将其过滤掉;
只有在读取到有效字符之后,该方法才会将其后的空格键,Tab键或Enter键等视为结束符,所以该方法不能得到带空格的字符串,该方法在扫描到空白符的时候会将前面的数据读取走,但也会丢下一个空白符"\r"在缓冲区中,所以也不能和nextLine()混用
nextLine():该方法字面上扫描一整行的意思,它的结束符只能时Enter键,即nextLine()方法返回的是Enter键之前没有被读取的所有字符,它是可以得到带空格的的字符串的
class test05{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(true){
try {
System.out.println("输入数字:");
int key = sc.nextInt();
} catch (Exception e){
System.out.println("请输入正确数字");
}
}
}
}
以上代码执行的时候,当输入数字时,输入字符串,就会出现一直循环输出
请输入正确数字
输入数字:
其原因还是在sc.nextInt()这,nextInt()方法在发生异常后,不能在接受用户输入的任何数据,而是徘徊在异常区域,外部还实现了死循环就会到导致输出,解决办法跟上面一样
class test05{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(true){
try {
System.out.println("输入数字:");
int key = sc.nextInt();
} catch (Exception e){
System.out.println("请输入正确数字");
// sc.nextLine();
sc = new Scanner(System.in);
}
}
}
}
//这俩种方案都可以解决问题
总结
nextInt()和next()方法读取数据都会留一个小尾巴(空白符"\r"),都会被nextLine()所读取,然后nextLine()无法获取字符串被直接跳过