一、前言

今天在复习Java基础知识部分时,看到了Scanner类,之前我只知道next()方法与nextLine()方法都是接受键盘输入的字符串进行返回的,也并没有去深深地看,于是今天趁着复习多注意了一眼,结果遇到了一个问题,如下

image-20200308215400036

可以看到,next()方法执行后,其下面的nextLine()方法还没有接收我的输入,程序直接就结束了。

二、nextLine()方法与next()、nextInt()方法...

  1. 要解决这个问题得了解下nextLine()方法与next()、nextInt()方法等等方法之间关于扫描的区别,我们知道nextLine()方法与next()方法都是接受键盘输入字符串的,他们的机制是Scanner扫描器进入内存的一块缓冲区去获取数据的,从第一个非结束符【空格、回车、Tab键...】开始扫描,而区别在于

    1. nextLine()方法是读取一整行,以一个回车符作为结束标记停止扫描
    2. next() / nextInt() / nextDouble()等方法是,读取到第一个结束符【空格、回车、Tab键】作为结束标记停止扫描
  2. next() / nextInt() / nextDouble()他们不会取走结束符号,把他们留在缓冲区;而nextLine()方***取走当前扫描行第一个非结束符之后、回车符之前的整行内容作为字符串进行返回,也就是可能会取走空格等,遇到回车结束【并不会取走回车】

    如下:

    Scanner sc1 = new Scanner(System.in);
            System.out.println("nextLine()方法输入:");
            String s1 = sc1.nextLine();
            System.out.println("next()方法输入:");
            String s2 = sc1.next();
            System.out.println("nextLine()结果:" + s1 + "\nnextLine()结果:" + s2);

    image-20200308221438523

  3. 所以最开始的代码中,先执行了Scanner的next()方法,其读到了内存缓冲区的回车符,结束扫描返回结果。然后nextLine()方法开始扫描的时候,它会优先读到残留在缓冲区的回车符,进而直接结束扫描,返回,自然我就没办法输入我的数据了

三、解决办法

要解决这个问题,最简单的方法有两个

  • 一、如果没必要读取空格的话,就不使用nextLine()方法,使用next()方法读取一个连续不间断的字符串

    Scanner sc1 = new Scanner(System.in);
    System.out.println("nextInt()方法接收一个整数:");
    int number = sc1.nextInt();
    
    System.out.println("next()方法接收一个不含空格的字符串:");
    String s2 = sc1.next();
    System.out.println("nextInt()结果:" + number + "\nnextLine()结果:" + s2);

    image-20200308223310798

  • 二、有必要读取空格的话,使用nextLine()方法接收你想输入的字符串之前,额外执行一次nextLine()方法把残留的回车符拿掉,这样再执行nextLine()方法就可以正常地输入并接收自己想要输入的数据了

    Scanner sc1 = new Scanner(System.in);
    System.out.println("nextInt()方法接收一个整数:");
    int number = sc1.nextInt();
    
    //提前执行一个nextLine()方法把回车吞掉
    String temp = sc1.nextLine();
    
    System.out.println("nextLine()方法接收一个可以包含空格的字符串:");
    String s2 = sc1.nextLine();
    System.out.println("nextInt()结果:" + number + "\nnextLine()结果:" + s2);

    image-20200308223618151

  • 三、当然还有其他的方案,这里就不再向下了