关于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

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

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

相关文章

  • Java实现二叉堆、大顶堆和小顶堆

    Java实现二叉堆、大顶堆和小顶堆

    二叉堆就是完全二叉树,或者是靠近完全二叉树结构的二叉树。大顶堆要求对于一个节点来说,它的左右节点都比它小;小顶堆要求对于一个节点来说,它的左右节点都比它大。本文将用Java分别实现二叉堆、大顶堆和小顶堆。需要的可以参考一下
    2022-01-01
  • springboot将mybatis升级为mybatis-plus的实现

    springboot将mybatis升级为mybatis-plus的实现

    之前项目工程用的是mybatis,现在需要将其替换为mybatis-plus,本文主要介绍了springboot将mybatis升级为mybatis-plus的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • SpringBoot参数校验示例详解

    SpringBoot参数校验示例详解

    SpringBoot自带了validation工具可以从后端对前端传来的参数进行校验,本文给大家介绍SpringBoot参数校验及用法,感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • 基于spring@aspect注解的aop实现过程代码实例

    基于spring@aspect注解的aop实现过程代码实例

    这篇文章主要介绍了基于spring@aspect注解的aop实现过程代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 解决SpringBoot运行报错:找不到或无法加载主类的问题

    解决SpringBoot运行报错:找不到或无法加载主类的问题

    这篇文章主要介绍了解决SpringBoot运行报错:找不到或无法加载主类的问题,具有很好的参考价值,对大家的学习或工作有一定的参考价值,需要的朋友可以参考下
    2023-09-09
  • SpringBoot整合腾讯云COS对象存储实现文件上传的示例代码

    SpringBoot整合腾讯云COS对象存储实现文件上传的示例代码

    本文主要介绍了SpringBoot整合腾讯云COS对象存储实现文件上传的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Java中关于Collections集合工具类的详细介绍

    Java中关于Collections集合工具类的详细介绍

    Java提供了一个操作Set、List和Map等集合的工具类:Collections,该工具提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了将集合对象设置为不可变、对集合对象实现同步控制等方法
    2021-09-09
  • Spring超详细讲解注解开发

    Spring超详细讲解注解开发

    Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势。本文将通过示例为大家详细讲讲Spring如何实现注解开发,感兴趣的可以学习一下
    2022-08-08
  • 利用spring boot如何快速启动一个web项目详解

    利用spring boot如何快速启动一个web项目详解

    这篇文章主要给大家介绍了关于利用spring boot如何快速启动一个web项目的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧、
    2017-12-12
  • java(jdk)环境变量配置(XP、win7、win8)图文教程详解

    java(jdk)环境变量配置(XP、win7、win8)图文教程详解

    对于初学java的同学来说,第一件事不是写hello world,而是搭建好java开发环境,下载jdk,安装,配置环境变量。这些操作在xp、win7、win8不同的操作系统里面配置不太一样,下面通过本文给大家介绍如何在上面不同操作系统下配置
    2017-03-03

最新评论