关于Scanner中nextInt()、nextLine()等方法总结与问题解决

 更新时间:2022年11月15日 10:23:43   作者:柠心语冰  
这篇文章主要介绍了关于Scanner中nextInt()、nextLine()等方法总结与问题解决,具有很好的参考价值,希望对大家有所帮助。

Scanner.next?() 方法介绍

Scanner.next?() 有很多种方法,具体名称与内容可以见下表格:

关于Scanner.next?() 的输入问题与分析

让我们先来用代码直观地感受一下使用scanner时经常出现的问题:

Scanner scanner = new Scanner(System.in);

System.out.printf("请输入你的名字: ");
String name = scanner.nextLine();

System.out.printf("请输入你的出生年份 : ");
int age = scanner.nextInt();

System.out.printf("请输入你喜欢的花 : ");
String nan = scanner.nextLine();  

System.out.printf( "你的名字是: " +name+ "%n 你的出生年份是 :" +age+ "%n 你喜欢的花是 :" +nan );

乍一看,没有什么问题,就是三个简单的输入与读取。但是让我们来看看结果输出:

请输入你的名字: asd
请输入你的出生年份 12
请输入你喜欢的花 : 你的名字是: asd
 你的出生年份是 :12
 你喜欢的花是 :
Process finished with exit code 0

很明显,最后一个在还没有来得及输入的情况下,直接执行了输出程序,然后结束了整个程序。

这是为什么呢?

这就涉及到上边表格中提到的Scanner.next?()方法结束接收条件。我们在重复使用Scanner的时候,其实是在向同一个缓存区内输入数据,而所谓结束接收条件其实就是不同的“断句符号”。让我们来快速地看一个例子与图解加深一下理解。

Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
String age = scanner.nextLine();
String nan = scanner.nextLine();
System.out.printf( "name: " +name+ "%n age: " +age+ "%n nan: " +nan );

结果输出:
12
23
21
name: 12
 age: 23
 nan: 21
Process finished with exit code 0

此时缓存区里内容是:12\n23\n21\n 。而这三个数字为什么会被精准的分配到变量name、age、nan中呢?就是因为scanner.nextLine();函数的结束接收条件为\n。这个函数可以在接收到键盘输出\n后停止接收,运行下一个程序。而\n正是我们在日常程序中进入下一个输入时按的回车。

同理可得,上面那个程序如果正常输入的话,缓存区里的内容是:asd\n12\nCornflower\n 。那么问题出现了,在第二个程序中我们用的都是scanner.nextLine(); ,他会根据\n的位置完整地读取每一份数据并赋值给对应变量。而现在,我们用的分别是scanner.nextLine(); 、 scanner.nextInt(); 、 scanner.nextLine(); ,他们的结束接收条件分别为 \n 、数值、\n

此时三个函数就会将数据读成这样:

很明显第二个scanner.nextInt()在遇到数值12后就已经结束接收,而就在我按下“进行下一个输入”的回车时,直接结束了第三个 scanner.nextLine();的接收。

因此这就是为什么会出现后面的数据还没有来得及输入,程序就已经结束的情况。

解决方法

那有没有解决办法呢?

肯定的好吧

方法很简单,就是在第二个和第三个方法之间加简单的 scanner.nextLine(); 方法 。这样那个被错误地结束第三个方法接收的“\n”,就被其他方法替代了。而第三个scanner.nextLine();也就可以正常接收数据了。

这是加上scanner.nextLine();后的缓存区读取情况:

这是加上scanner.nextLine();后程序以及运行结果:

Scanner scanner = new Scanner(System.in);

System.out.printf("请输入你的名字: ");
String name = scanner.nextLine();

System.out.printf("请输入你的出生年份 ");
int age = scanner.nextInt();
scanner.nextLine();        //加的

System.out.printf("请输入你喜欢的花 : ");
String nan = scanner.nextLine();
System.out.printf( "你的名字是: " +name+ "%n 你的出生年份是 :" +age+ "%n 你喜欢的花是 :" +nan );

请输入你的名字: asd
请输入你的出生年份 12
请输入你喜欢的花 : Cornflower
你的名字是: asd
 你的出生年份是 :12
 你喜欢的花是 :Cornflower
Process finished with exit code 0

这回就很愉快地输入并输出啦!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 打开IDEA配置Spring项目时发现没有选择java 1.8的选项解决方案

    打开IDEA配置Spring项目时发现没有选择java 1.8的选项解决方案

    这篇文章主要介绍了打开IDEA配置Spring项目时发现没有选择java 1.8的选项的解决方案,文中通过代码介绍的非常详细,对大家学习或者idea具有一定的参考借鉴价值,需要的朋友可以参考下
    2025-03-03
  • SpringBoot如何注册Servlet、Filter、Listener的几种方式

    SpringBoot如何注册Servlet、Filter、Listener的几种方式

    在Servlet 3.0之前都是使用web.xml文件进行配置,这篇文章主要介绍了SpringBoot如何注册Servlet、Filter、Listener的几种方式,在Servlet 3.0之前都是使用web.xml文件进行配置,
    2018-10-10
  • SpringBoot 整合Jest实例代码讲解

    SpringBoot 整合Jest实例代码讲解

    本文通过实例代码给大家介绍了SpringBoot 整合Jest的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08
  • SpringBoot mybatis-plus使用json字段实战指南

    SpringBoot mybatis-plus使用json字段实战指南

    在现代应用开发中经常会使用JSON格式存储和传输数据,为了便捷地处理数据库中的JSON字段,MyBatis-Plus提供了强大的JSON处理器,这篇文章主要给大家介绍了关于SpringBoot mybatis-plus使用json字段的相关资料,需要的朋友可以参考下
    2024-01-01
  • Java数字图像处理之图像灰度处理

    Java数字图像处理之图像灰度处理

    这篇文章主要为大家详细介绍了Java数字图像处理之图像灰度处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Java 嵌入数据引擎从 SQLite 到 SPL详解

    Java 嵌入数据引擎从 SQLite 到 SPL详解

    这篇文章主要介绍了Java 嵌入数据引擎:从 SQLite 到 SPL,SQLite架构简单,其核心虽然是C语言开发的,但封装得比较好,对外呈现为一个小巧的Jar包,能方便地集成在Java应用中,本文给大家介绍的非常详细,需要的朋友参考下
    2022-07-07
  • ElasticSearch 深度分页示例解析

    ElasticSearch 深度分页示例解析

    这篇文章主要为大家介绍了ElasticSearch 深度分页示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 浅谈spring boot使用thymeleaf版本的问题

    浅谈spring boot使用thymeleaf版本的问题

    这篇文章主要介绍了spring boot使用thymeleaf版本的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Spring如何实现管理事务

    Spring如何实现管理事务

    Spring通过编程式事务和声明式事务管理来控制事务的边界和行为,声明式事务管理通过@Transactional注解实现,提供了丰富的配置选项来控制事务的行为,如传播行为、隔离级别、超时时间和回滚规则
    2024-11-11
  • 解读什么是构造方法?能否被重写或重载?

    解读什么是构造方法?能否被重写或重载?

    这篇文章主要介绍了什么是构造方法?能否被重写或重载问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04

最新评论