Java输入中nextInt后接nextLine值为空的问题
问题
今天在学Java基础问题做学生管理系统的时候遇到一个小问题,代码如下:
public static void addStu(ArrayList<HubuStudent> studentList){
//添加学生
HubuStudent stu = new HubuStudent();
Scanner sc = new Scanner(System.in);
//键盘写入学生信息
System.out.println("请输入学生姓名");
String sname = sc.nextLine();
System.out.println("请输入学生学号");
String sno = sc.nextLine();
System.out.println("请输入学生年龄");
int sage = sc.nextInt();
System.out.println("请输入学生居住地");
String sarea = sc.nextLine();
//添加学生信息
stu.setSname(sname);
stu.setSno(sno);
stu.setSage(sage);
stu.setSarea(sarea);
//添加到学生集合中
studentList.add(stu);
}
执行过程中发现,从键盘读入年龄后,居住地会直接跳过;设置断点调试后发现,sarea直接被赋了一个空值(""),多次实验发现问题出在nextInt()之后输入的回车里,输入学生年龄后会按下回车,而回车恰好会被下一行中的nextLine()所捕捉,导致sarea被直接赋了一个空字符串。
解决方法
这里提供三个解决本问题的思路:
思路一
第一个思路是调整顺序,也即将需要读入整数的放在最后(或者nextLine)后面:
System.out.println("请输入学生居住地");
String sarea = sc.nextLine();
System.out.println("请输入学生年龄");
int sage = sc.nextInt();
这样就避免了回车会被nextLine捕捉的情况;
思路二
第二个思路是将nextLine换成next,next并不会捕捉之前的回车;
System.out.println("请输入学生居住地");
String sarea = sc.next();
思路三
第三个思路最简单暴力,不过可能需要修改的地方会比较多,就是直接将年龄的类型也定义为String,这样所有的键盘读入时都使用nextLine,就不会出现上述的问题辣
private String sage;
public String getSage() {
return sage;
}
public void setSage(String sage) {
this.sage = sage;
}
System.out.println("请输入学生年龄");
int sage = sc.nextLine();
System.out.println("请输入学生居住地");
String sarea = sc.nextLine();