使用Scanner的nextLine()读取不到数据。
-
使用nextLine()时读取不到数据并自动结束该方法。
这是因为在调用nextLine()方法前调用了(nextInt(),nextfloat(),nextDouble())等。出现这种情况的原因是nextLine()方法的处理机制不同,nextInt()方法在缓冲区中遇到“空格”、“回车符”等空白字符时会将空白字符前的数据读取走,但空白字符不会被处理掉,而nextLine()方法是在缓冲区中读取一行数据,这行数据以“回车符”为结束标志,nextLine()会从缓冲区中把上一个方法未处理的“回车符”在内的数据提走。所以nextInt()后的nextLine()方法并非读取不到数据,因为nextInt()将“回车符”留在了缓冲区,nextLine()读取时遇到的第一个字符便是“回车符”,所以直接结束了。
代码演示:
public class ScannerTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个float类型的小数");
float f = sc.nextFloat();
System.out.println("请输入一个double类型的小数");
double d = sc.nextDouble();
System.out.println("请输入一个int类型的整数:");
int n = sc.nextInt();
System.out.println("请输入第一个字符串:");
//这个nextLine()方法会读取上一个nextInt()方法留在缓冲区的“回车符”自动结束该方法
String s1 = sc.nextLine();
System.out.println("请输入第二个字符串:");
String s2 = sc.nextLine();
System.out.println("这是一个float类型的小数:"+f);
System.out.println("这是一个double类型的小数:"+d);
System.out.println("这是一个int类型整数:"+n);
System.out.println("这是第一个字符串:"+s1); //
System.out.println("这是第二个字符串:"+s2);
} }
运行结果:
请输入一个float类型的小数
3.14
请输入一个double类型的小数
3.1415926
请输入一个int类型的整数:
1024
请输入第一个字符串:
请输入第二个字符串:
程序猿
这是一个float类型的小数:3.14
这是一个double类型的小数:3.1415926
这是一个int类型整数:1024
这是第一个字符串:
这是第二个字符串:程序猿
- 解决方法:
2.1 在要使用nextLine()之前先调用一次nextLine(),这样留在缓冲区的“回车符”就会被处理掉,这时第二个nextLine()方法就可以正常读取到数据。
代码演示:
public class ScannerTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个float类型的小数");
float f = sc.nextFloat();
System.out.println("请输入一个double类型的小数");
double d = sc.nextDouble();
System.out.println("请输入一个int类型的整数:");
int n = sc.nextInt();
System.out.println("请输入第一个字符串:");
//在使用nextLine()之前先调用一次nextLine()用来处理缓存区的数据
String s = sc.nextLine();
String s1 = sc.nextLine();
System.out.println("请输入第二个字符串:");
String s2 = sc.nextLine();
System.out.println("这是一个float类型的小数:"+f);
System.out.println("这是一个double类型的小数:"+d);
System.out.println("这是一个int类型整数:"+n);
System.out.println("这是第一个字符串:"+s1); //
System.out.println("这是第二个字符串:"+s2);
}
}
运行结果:
请输入一个float类型的小数
3.14
请输入一个double类型的小数
3.1415926
请输入一个int类型的整数:
1024
请输入第一个字符串:
清除完缓冲区后
请输入第二个字符串:
程序猿
这是一个float类型的小数:3.14
这是一个double类型的小数:3.1415926
这是一个int类型整数:1024
这是第一个字符串:清除完缓冲区后
这是第二个字符串:程序猿
2.2 避免在nextLine()之前调用nextInt(),nextfloat(),nextDouble()等方法,可以统一使用nextLine()来读取数据,之后再进行类型转换。
代码演示:
public class ScannerTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//统一使用nextLine()来读取数据,再根据需要进行类型转换
System.out.println("请输入一个float类型的小数");
//float f = sc.nextFloat();
float f = Float.valueOf(sc.nextLine());
System.out.println("请输入一个double类型的小数");
//double d = sc.nextDouble();
double d = Double.valueOf(sc.nextLine());
System.out.println("请输入一个int类型的整数:");
//int n = sc.nextInt();
int n = Integer.valueOf(sc.nextLine());
System.out.println("请输入第一个字符串:");
String s1 = sc.nextLine();
System.out.println("请输入第二个字符串:");
String s2 = sc.nextLine();
System.out.println("这是一个float类型的小数:"+f);
System.out.println("这是一个double类型的小数:"+d);
System.out.println("这是一个int类型整数:"+n);
System.out.println("这是第一个字符串:"+s1); //
System.out.println("这是第二个字符串:"+s2);
}
}
运行结果:
请输入一个float类型的小数
3.14
请输入一个double类型的小数
3.1415926
请输入一个int类型的整数:
1024
请输入第一个字符串:
根据需要的数据类型进行转换
请输入第二个字符串:
程序猿
这是一个float类型的小数:3.14
这是一个double类型的小数:3.1415926
这是一个int类型整数:1024
这是第一个字符串:根据需要的数据类型进行转换
这是第二个字符串:程序猿