一、问题描绘:

前几天遇到了一个小问题:为了简化,我手打了一段简单的代码,如下:

import java.util.Scanner;
public class Test01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入一个数字:");
        int a = sc.nextInt();
        System.out.println("输入一个字符串:");
        String str = sc.nextLine(); //运转程序宛如越过了这段代码相同
        System.out.println("输出的是:"+str);
    }
}

运转,输入2,然后点击回车,此时代码直接会运转完毕。str无法承受任何字符串(在咱们眼中宛如直接越过了该条句子相同)。

Java中next()和nextLine()的区别(为什么nextLine()输入回车没显示)

这是为何呢?nextLine()不是承受字符串吗?怎么不履行呢?

二、原因分析:

这儿就要详细讲一下nextLine()在承受键盘输入的注意事项了。

注意nextLine() 会接纳回车字符(包括空格和Tab键)。

基于这个特性,上述代码在输入2之后打了一个回车,nextInt()接纳了2 这个数字之后碰到回车符完毕,此时’\n’这个回车字符会留在缓冲区里。随后履行下一条句子nextLine(),nextLine()会承受(不排挤不疏忽)这个回车字符,而且使得句子直接完毕(nextLine()以回车符为完毕)。 ==下面是nextLine()的源码:== 函数在承受回车之后直接回来。

Java中next()和nextLine()的区别(为什么nextLine()输入回车没显示)

所以,在咱们眼中:

 String str = sc.nextLine();

宛如没有履行相同。

解决方案1:

已然咱们知道了nextLine()的特性,那么,咱们可以在nextInt()句子后面再加上一句nextLine()句子,用于“吃”掉这个输入缓冲区的’\n’。

例如:

import java.util.Scanner;
public class Test01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入一个数字:");
        int a = sc.nextInt();
        System.out.println("输入一个字符串:");
        sc.nextLine(); //加上这条句子,用于吃掉'\n'
        String str = sc.nextLine();
        System.out.println("输出的是:"+str);
    }
}

解决方案2:

在后面补上一条Scanner类里边的skip办法,用于越过那个换行符。

import java.util.Scanner;
public class Test01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入一个数字:");
        int a = sc.nextInt();
        System.out.println("输入一个字符串:");
        sc.skip("\n"); //加个skip办法,用于越过那个换行符。
        String str = sc.nextLine();
        System.out.println("输出的是:"+str);
    }
}

弥补:

==next()和nextLine()的差异==:

next和nextline办法的差异在于nextLine会接纳回车字符(包括空格和Tab键)而next不会。

next()办法是不承受回车字符的(包括空格和Tab键)!

什么意思?拿上述的比如来说,要是把nextLine()换成next():

import java.util.Scanner;
public class Test01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入一个数字:");
        int a = sc.nextInt();
        System.out.println("输入一个字符串:");
        String str = sc.next(); //换成这个
        System.out.println("输出的是:"+str);
    }
}

程序是正常进行的,由于next()就算碰到了输入缓冲区里边的’\n’也会==疏忽掉==(不承受)!!!

最重要的一点是:nextInt、nextdoublie、nextfloat和next办法的效果是相同的,需求特别注意。

总结

所以说具体事务要具体分析,如果老铁们要输入一大行字符串(以空格分隔)的话,调用nextLine()。由于next()碰到空格就中止了,只截取有效部分,有时候不能满足事务需求。还有最后一点便是注意这个“吃掉”回车符的小技巧~纯手打,望老铁们多多支撑(●∀●)