使用Scanner的nextLine()读取不到数据。

使用Scanner的nextLine()读取不到数据。

  1. 使用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
这是第一个字符串:
这是第二个字符串:程序猿
  1. 解决方法:
    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
这是第一个字符串:根据需要的数据类型进行转换
这是第二个字符串:程序猿
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值