问题引入

        初学Java时经常使用到Scanner类,其接受键盘输入的字符串方法有两种: .next()和.nextLine(),讨论他们的区别。

        使用 .next() 和 .nextLine()先后接受两次键盘输入,然后打印输入的内容

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("第一次输入");
        String s1 = input.next();
        System.out.println("第二次输入");
        String s2 = input.nextLine();
        System.out.println("第一次输入内容:" + s1 + "\t第二次输入内容:" + s2);
    }
}

Java中.next()和.nextLine()_System

        运行,输入 1 ,然后回车,发现还没进行第二次输入,系统就开始打印输入内容了

Java中.next()和.nextLine()_JAVA_02

Java中.next()和.nextLine()_有效字符_03编辑

     如果调换一下顺序,先使用 .nextLine(),在使用 .next(),可以正常录入两次键盘输入

Java中.next()和.nextLine()_字符串_04

Java中.next()和.nextLine()_字符串_05编辑

next() 和 nextLine()的区别

接收内容

next() 

 1. 不接收空格,只接收有效字符,不能得到一个带空格的字符串 

 2. next在没有读到有效字符前会把空格、Tab、Enter自动去掉   

nextLine()

 1. 可以接受空格,能得到带空格的字符串  

 2. 返回的是Enter之前的一切字符

停止接收

next() 

  next()在读到有效字符后才会将空格、Tab、Enter视为结束符

nextLine()

  nextLine()将Enter视为结束

 注意:next()在遇到Enter结束时,并不会吸收Enter; 而nextLine()会吸收Enter。

何谓吸收?
        next()遇到Enter结束,此时键盘录入Enter 的信息仍然停留在内存中, 下次需要输入时,直接读取了该信息。因此本文开头的代码运行时,首先输入1然后回车之后,next()结束,键盘录入Enter的信息没有被吸收,然后被nextLine()吸收并作为结束符。才导致了最后的运行结果。                                 

补充说明
        经过验证,除了nextLine()其他的next的方法,如nextDouble()  ,nextFloat() ,nextInt() 等,都无法吸收Enter。 

如何解决?
        可以多使用一次nextLine(),用停留在内存中的Enter吸收掉。