关于Scanner.nextInt()和nextLine(),标准输入被强制跳过的问题

  • 其实关于这个问题以前在搜索BufferedReader和Scanner时就看到过几次,不过当自己中招的时候还是没能第一时间反应过来啊。

  • 首先结论就是,nextLine()读到换行符"\n"结束,而nextInt()只读取数字。
    用nextInt()读取标准输入的时候数字后面有个回车(换行符"\n")没读,下一次读取标准输入如果是nextLine(),就会把那个回车读了,于是用户端啥事儿都没干这一次标准输入就结束了。

  • 然后下面是我这次犯错的例子。输入学号和名字,最后输出。

//javac -encoding utf-8 Testt.java
import java.util.Scanner;

class Student {
	private int id;
	private String name;

	void setId(int id) { this.id = id; }
	int getId() { return id; }

	void setName(String name) { this.name = name; }
	String getName() { return name; }

	void show() { System.out.println(id + ":" + name); }
}

public class Testt {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Student stu = new Student();

		System.out.print("请输入学号:"); // !!!
		int id = sc.nextInt();
		stu.setId(id);

		System.out.print("请输入姓名:");
		String name = sc.nextLine();
		stu.setName(name);

		stu.getId();
		stu.getName();

		stu.show();
	}
}

编译执行结果为:
在这里插入图片描述
本想输入姓名,但是数字后面的换行符被读了,nextLine()的操作结束。
默认值为null的String在输出时也表现为回车。

  • 解决方法
  1. 用nextLine()接收后把String转换为int
System.out.print("请输入学号:"); // !!!
// int id = sc.nextInt();
String dis = sc.nextLine();  // 用nextLine()接收后把String转换为int
int id = Integer.parseInt(dis);
stu.setId(id);
  1. 在nextInt()下面写一行nextLine(),用于抵消数字后面的回车
System.out.print("请输入学号:"); // !!!
int id = sc.nextInt();
String dis = sc.nextLine();  // 用于接收输入数字后的确认回车
stu.setId(id);
  1. 用BufferedReader的标准输入。
    本来在最开始还只需要输入一次的时候,我就是觉得Scanner可以不必像BufferedReader那样需要先接收String然后再进行数据类型的转换,而且new的时候写的代码也少,也不用写throws IOException。
    现在突然觉得既然方法2和BufferedReader没什么差别,不如只记BufferedReader的方法(笑)。
    其实还是要针对性的使用啦,用Scanner进行简单文本输入的读取挺方便的?就像我们讲师说的,多一个方法就像多了一种武器。
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值