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

声明 原文链接:https://blog.csdn.net/Geffin/article/details/105253700
作者 Geffin 如侵权则删除

以前做算法题,都是实现一个方法,需要的参数会在方法参数中直接给出,而且需要的返回值直接在方法中 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 键结束
放个原博主回答帮大家理解 请见谅 A:为什么输入hello以后的enter没有被nextLine吸收 B:enter是已经被吸收了的
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值