nextLine和next函数的使用注意点

今天在写一段程序的时候,其中有一段是从键盘上输入数据,但是出现了其中有一个输入直接跳过的情况

import java.util.Scanner;

public class Test {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你的姓名:");
        final String name = sc.nextLine();
        System.out.println("请输入你的年龄:");
        final int age = sc.nextInt();
        System.out.println("请输入你的电话号码:");
        String number=sc.nextLine();

    }
}

可以发现当在输入电话号码时,还没有进行输入时,程序就已经截至了,说明它可能是跳过了该段输入了

对这几个输入函数进行分析

nextLine
nextLine();这个函数在你输入完一些东西之后按下回车则视为输入结束,输入的内容将被作为String返回。nextLine可以读入回车,但是回车不会成为返回字符(因为\n是转义字符),所以我们在返回的字符里面看不见\n

next

next();这个函数会扫描从有效字符起到空格,Tab,回车等结束字符之间的内容并作为String返回。不会读取回车

  • next和nextLine的区别
    再举个例子,输入" abc def gh\n",next();会返回abc,而nextLine();会返回 abc def gh\n,我们看到的是 abc def gh

nextInt

nextInt是读取一个整形数字,不能读取回车,遇到出车将停止读取

跳过现象原因分析

因为nextInt不能接收\n,而nextLine可以接收回车,当nextInt回车结束时;nextLine直接就接收nextInt的回车了,此时键盘还没有录入数据

结论

in.nextLine();不能放在in.nextInt()代码段后面;因为in.nextLine()会读入"\n"字符,但"\n"并不会成为返回的字符,而nextInt()是不会读入“\n”的;

解决方案

方案一

把代码中的nextLine();换成next();便可以解决“跳过”问题。
因为next并不会接收回车

方案二
可以在nextInt后面专门加一个nextLine来接收多余的回车

[参考一]( https://zhuanlan.zhihu.com/p/25094698#:~:text=nextLine ()%3B这个函数在你输入完一些东西之后按下回车则视为输入结束,输入的内容将被作为String返回。 next ()%3B这个函数与之不同在于%2Cnext ,%28%29%3B%E4%BB%80%E4%B9%88%E9%83%BD%E4%B8%8D%E8%BE%93%E5%85%A5%E7%9B%B4%E6%8E%A5%E6%95%B2%E5%9B%9E%E8%BD%A6%E4%B8%8D%E4%BC%9A%E8%BF%94%E5%9B%9E%EF%BC%8C%E8%80%8CnextLine%20%28%29%E5%8D%B3%E4%BD%BF%E4%B8%8D%E8%BE%93%E5%85%A5%E4%B8%9C%E8%A5%BF%E7%9B%B4%E6%8E%A5%E6%95%B2%E5%9B%9E%E8%BD%A6%E4%B9%9F%E4%BC%9A%E8%BF%94%E5%9B%9E%E3%80%82%20%E6%89%80%E4%BB%A5%E6%8A%8A%E4%BB%A3%E7%A0%81%E4%B8%AD%E7%9A%84nextLine%20%28%29%3B%E6%8D%A2%E6%88%90next%20%28%29%3B%E4%BE%BF%E5%8F%AF%E4%BB%A5%E8%A7%A3%E5%86%B3%E2%80%9C%E8%B7%B3%E8%BF%87%E2%80%9D%E9%97%AE%E9%A2%98%E3%80%82)

参考二

posted @ 2023-04-11 12:05  一往而深,  阅读(140)  评论(0)    收藏  举报