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

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

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

ps:如果有问题欢迎一起讨论,同时如果发现本文有错误地地方,欢迎评论指正!

  • 18
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值