next()和nextLine()的一些小问题

简介: next()和nextLine()的一些小问题

问题描述:

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

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无法接受任何字符串(在我们眼中宛如直接跳过了该条语句一样)。
在这里插入图片描述
这是为何呢?nextLine()不是接受字符串吗?怎么不执行呢?

原因分析:

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

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

基于这个特性,上述代码在输入2之后打了一个回车,nextInt()接收了2 这个数字之后碰到回车符结束,此时'\n'这个回车字符会留在缓冲区里。随后执行下一条语句nextLine(),nextLine()会接受(不排斥不忽略)这个回车字符,并且使得语句直接结束(nextLine()以回车符为结束)。
==下面是nextLine()的源码:==
函数在接受回车之后直接返回。
在这里插入图片描述

所以,在我们眼中:

 String str = sc.nextLine(); 

宛如没有执行一样。

解决方案1:

既然我们知道了nextLine()的特性,那么,我们可以在nextInt()语句后面再加上一句nexrLine()语句,用于“吃”掉这个输入缓冲区的'\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()碰到空格就停止了,只截取有效部分,有时候不能满足业务需求。还有最后一点就是注意这个“吃掉”回车符的小技巧~纯手打,望老铁们多多支持(●ˇ∀ˇ●)

相关文章
|
算法 数据处理 开发者
FFmpeg库的使用与深度解析:解码音频流流程
FFmpeg库的使用与深度解析:解码音频流流程
307 0
|
机器学习/深度学习 数据采集 算法
基于 UNet 的农业图像的分割| 学习笔记
快速学习基于 UNet 的农业图像的分割。
基于 UNet 的农业图像的分割| 学习笔记
|
JavaScript 容器
vue element plus Avatar 头像
vue element plus Avatar 头像
312 0
|
人工智能 编解码 搜索推荐
AI绘画入门:从小白到入门,轻松玩转AI作画
随着AI技术的不断发展,AI绘画已经不再是遥不可及的梦想,它正逐渐走入大众视野,成为了一种新兴的艺术创作形式。即使没有绘画基础,你也可以通过AI工具轻松创作出精美的作品。本文将带你从小白入门,学习AI绘画的基础知识和操作技巧,让你快速体验AI绘画的乐趣。
984 0
|
数据安全/隐私保护
如何配置战斧指纹浏览器和IPXProxy海外代理IP?
通过代理IP,用户可以轻松绕过地域限制,访问全球范围内的网站和服务。特别是对于跨境用户来说,需要在目标市场投放广告,而代理IP能帮助实现精准投放,快速的提升品牌或者店铺的知名度。那如何在如何在战斧指纹浏览器中设置IPXProxy海外代理IP?
430 0
|
XML 数据格式 Python
Python自动化脚本编写技巧
本文介绍了Python自动化脚本的编写技巧:选择合适的库(如os, requests, BeautifulSoup)以简化编程,利用循环和条件语句实现流程控制,通过函数和模块提高代码的可读性和可维护性,使用异常处理保证脚本稳定性,以及借助日志记录进行问题追踪。通过这些方法,可以编写出高效、稳定的自动化脚本。
|
Android开发
Android 新建一个lunch项(全志方案)
Android 新建一个lunch项(全志方案)
334 0
|
存储 算法 Shell
【Linux 环境变量相关】深入理解Linux下 CMake、Shell 与环境变量的交互(二)
【Linux 环境变量相关】深入理解Linux下 CMake、Shell 与环境变量的交互
426 0
|
域名解析 网络协议
|
Linux C语言
centos 7 下使用高版本gcc编译安装
centos 7 下使用高版本gcc编译安装
569 0