前言

以前做算法题,都是实现一个方法,需要的参数会在方法参数中直接给出,而且需要的返回值直接在方法中 return 就好了。但是,这次阿里笔试,让博主遭遇百万点暴击,需要的参数居然要到输入流中读取,而且返回结果居然直接输出到控制台上!

由于没有见过这种套路,博主的心态极差,且十分惊奇地发现,当使用 Java 输入类 nextLine 方法读取输入流中的字符串时,总会莫名其妙地少读一部分!

然后,就没有然后了。。。虽然博主感觉题目不算太难,但连数据都读不到,还谈啥解题呢?最终,虽然博主还是不忘初心乱写一通,终究没有奇迹发生,饮恨拿下零蛋。出师未捷身先死,长使英雄泪满襟!

读取一个数字

既然我们要读取输入,肯定得用到 Scanner 类,这个类倒是挺简单的,例如,我们需要读取一个数字,可以这样子设计程序。

package test;import java.util.Scanner;public class HelloWorld {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int i = sc.nextInt();System.out.println("读取到的数字是:" + i);}
}

我们随意输入一个数字 100,控制台的输出也证明了我们的程序可以读取这个数字。

博主在读取字符串上的狗血经历

好了,重点来了!读取数字倒没什么,读取字符串倒是要了博主的老命!博主在读取数据的时候一直尝试使用 nextLine 这个方法来读取字符串(笔试时我并不知道 next 这个方法),nextLine 这家伙倒好,给我读出来的数据总是缺斤少两,真想去投诉它!

我们来还原一下现场,需求是这样的,需要我们读取一个数字,这个数字表示输入字符串的数量,然后下面跟着的就是一系列需要读入的字符串了,博主当时脑残,想都没想,大笔一挥,写下如下代码:

package test;import java.util.Scanner;public class HelloWorld {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int i = sc.nextInt();//读取的字符串数量int index = 0;String[] array = new String [i];//存放读取的字符串while(index < i) {array[index++] = sc.nextLine();}for (String str : array) {//输出读取的字符串System.out.println("输入的字符串:" + str);}}
}

理想很美好,现实很骨感,写代码时光芒万丈,检查时却怨天尤人。博主发现,这样的代码永远无法读取最后一行输入的字符串,这是为啥呢?

一生要强的博主在笔试惨败之后去查阅了 nextLine 方法的用法,发现 nextLine 可以接收空格或者 tab 键,其输入以 enter 键结束

这倒是能解释通了!程序在通过 nextInt 方法读取数字之后,会留下一个 enter 键,这个 enter 键会被第一个执行的 nextLine 函数接收,这导致我们能够读取的数据永远少一行(nextLine 少执行一次),同时也能解释为什么字符串数组第一个元素为空。

这个问题怎么解决呢?Java 输入类读取字符串的函数并非只有 nextLine,通过 next 也能实现类似的功能,只不过 next 与 nextLine 不同,next 不会接收回车符,tab 或者空格键。在我们使用 nextLine 时,需要注意前面是否有 enter 键,如果有,就会被 nextLine 吸收,从而造成 bug!

既然明白了 nextLine 与 next 的原理,解决问题就变得简单了,将读取字符串的函数由 nextLine 改为 next 便可,这样就不会吸收 nextInt 留下的 enter 键了。改进过的程序如下:

package test;import java.util.Scanner;public class HelloWorld {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int i = sc.nextInt();//读取的字符串数量int index = 0;String[] array = new String [i];//存放读取的字符串while(index < i) {array[index++] = sc.next();}for (String str : array) {//输出读取的字符串System.out.println("输入的字符串:" + str);}}
}

总结

最后我们再来总结一下 nextLine 与 next 两个方法的区别:

  1. next 不会接收回车符,tab 或者空格键,在接收有效数据之前会忽略这些符号,若已经读取了有效数据,遇到这些符号会直接退出
  2. nextLine 可以接收空格或者 tab 键,其输入以 enter 键结束

博主在阿里笔试中拿了0分,竟是因为分不清楚 Java 输入类 nextLine 与 next 两个方法的区别相关推荐

  1. 本博客的博主原创文章均采用 CC BY-NC-SA 4.0 进行许可

    本博客的博主原创文章均遵循 CC 4.0 BY-SA 版权协议,所有与之冲突的版权协议均为无效协议.

  2. Java黑皮书课后题第7章:7.10(找出最小元素的下标)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素下标。编写测试程序,提示用户输入10个数字,调用这个方法返回最小值的下标(多个则最小

    7.10(找出最小元素的下标)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素下标.编写测试程序,提示用户输入10个数字,调用这个方法返回最小值的下标(多个则返回最小的下标) 题目 题目描述 ...

  3. Java中的string定义的两种方法和区别

    java中的String定义的两种方法和区别 第一种:new方式 String s1 = new String("hello world"); String s2 = new St ...

  4. jQuery插件:Validation中success和submitHandler两个方法的区别

    jQuery插件:Validation中success和submitHandler两个方法的区别 http://www.mzwu.com/article.asp?id=3357 先执行onsubmit ...

  5. java字符串构造函数的应用_构造函数中的参数0需要找不到类型为'java.lang.String'的bean...

    我正在使用Spring Boot 2.X应用程序进行Spring Batch,实际上我已经从git中检出了它的现有代码.在运行该应用程序时,由于以下错误而导致失败仅对我自己,而相同的代码对其他人也有效 ...

  6. 【乘风伯乐奖】寻找百位乘风者伯乐,邀请新博主入驻即可获奖

    简介:乘风伯乐奖,面向阿里云开发者社区已入驻乘风者计划的博主(技术/星级/专家),邀请用户入驻乘风者计划即可获得乘风者定制周边等实物奖励.本期面向阿里云开发者社区寻找100位乘风伯乐,邀请人数月度TO ...

  7. 大数据搭建各个子项目时配置文件技巧(适合CentOS和Ubuntu系统)(博主推荐)...

    不多说,直接上干货! 很多同行,也许都知道,对于我们大数据搭建而言,目前主流,分为Apache 和 Cloudera 和 Ambari. 后两者我不多说,是公司必备和大多数高校科研环境所必须的! 分别 ...

  8. CSDN产品公告:APP新增大厂在线刷题功能、博主排名规则更新、MD编辑器优化

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blogdev.blog.csdn.net/article/deta ...

  9. java多线程同步的四种方法_java中实现多线程的两种方法

    java多线程有几种实现方法,都是什么?同步有几种实java中多线程的实现方法有两种:1.直接继承thread类:2.实现runnable接口:同步的实现方法有五种:1.同步方法:2.同步代码块:3. ...

最新文章

  1. 在MySQL中的特定列之后添加多个列
  2. spring boot / cloud (二) 规范响应格式以及统一异常处理
  3. nginx-启动gzip、虚拟主机、请求转发、负载均衡
  4. 【干货】精通网红OSPF协议---进阶篇
  5. jsp页面其本质就是一个servlet
  6. 计算机意外重启或遇错误无法继续,计算机意外地重新启动或遇到错误如何解决?...
  7. ubuntu清除无效的右键打开方式
  8. 剑指offer(刷题1-10)--c++,Python版本
  9. 想都不敢想!这8个神奇“黑科技”原来已经有人弄出来了
  10. Git笔记(10) 别名
  11. S7-1200智能IO设备使用方法
  12. 计算机上fn按键,fn键设置方法
  13. Linux系统备份与还原-Clonezilla
  14. 实例解读模拟电子技术完全学习与应用
  15. 固定资产管理mysql_固定资产管理系统数据库设计
  16. dedecms 栏目绑定二级域名
  17. 微信扫一扫功能扫描二维码调用外部浏览器打开指定页面实现微信中下载APP的功能
  18. 为什么谷歌不起诉华为的鸿蒙系统?
  19. python tif转jpg_无法将tiff图像转换为jpg
  20. JavaScript:原生JS实现Facebook实时消息抓捕

热门文章

  1. Kingdian慧荣SM2256K AB主控固态硬盘卡住慢修复教程
  2. 太阳能光伏发电系统原理及组成
  3. 太阳能路灯的根本结构及作业原理
  4. 简单带验证码的登陆网站破解
  5. Android Google Map实例 - 在地图和卫星图之间切换(Android mapview)
  6. Linux入门操作指南
  7. 爬取淘女郎模特个人信息数据和写真
  8. vue+openlayers图形交互,实现多边形绘制、编辑和保存
  9. 李一男辞职调查:走出华为的叛逆男人
  10. vue移动端适配—手动rem适配