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