Java医疗预约系统添加人员功能:输入跳过与空指针报错求助
问题解决方案
问题1:输入姓名环节被直接跳过
原因:Scanner.nextInt()仅读取整数,输入身份证号后按下回车,换行符会留在输入缓冲区,后续Scanner.nextLine()会直接读取这个换行符,导致姓名输入被跳过。
解决方法:每次调用nextInt()后,调用r.nextLine()清空缓冲区的换行符;或统一用nextLine()读取输入后转换为对应数据类型。
问题2:NullPointerException空指针异常
原因:Person people[] = new Person[9];仅创建了能容纳9个Person对象的数组,但数组内每个元素默认是null,没有实际创建Person实例,直接调用people[0].setPerson()会触发空指针异常。同时当前代码固定往people[0]添加人员,会覆盖已有数据,需改为往数组空位置依次添加。
修正后的完整代码
Person类(需补充实现)
public class Person { private int id; private String name; private int tel; public Person() {} public Person(int id, String name, int tel) { this.id = id; this.name = name; this.tel = tel; } public void setPerson(int id, String name, int tel) { this.id = id; this.name = name; this.tel = tel; } // 重写toString,查看人员时显示可读信息 @Override public String toString() { return "人员信息:身份证号=" + id + ", 姓名=" + name + ", 电话号码=" + tel; } }
修正后的Menu类
import java.util.Scanner; public class Menu { Person people[] = new Person[9]; private int personCount = 0; // 记录已添加人员数量 public Menu() {} void showMenu(){ Scanner r = new Scanner(System.in); int option; do { System.out.println("==== 医疗预约管理 ===="); System.out.println("1 - 添加人员"); System.out.println("2 - 查看人员"); System.out.println("3 - 预约挂号"); System.out.println("4 - 取消预约"); System.out.println("5 - 查看所有预约"); System.out.println("6 - 平均预约时长"); System.out.println("7 - 按日期统计平均预约时长"); System.out.println("8 - 保存预约记录"); System.out.println("9 - 读取预约记录"); System.out.println("0 - 退出"); System.out.println("请选择所需操作:"); // 处理非整数输入,避免程序崩溃 while (!r.hasNextInt()) { System.out.println("请输入有效的数字选项!"); r.next(); } option = r.nextInt(); r.nextLine(); // 吃掉换行符,避免后续nextLine读取空内容 switch(option){ case 1: addPerson(r); break; case 2: showPeople(); break; case 0: System.out.println("退出系统"); break; default: System.out.println("无效选项,请重新选择"); } } while (option != 0); // 循环显示菜单直到退出 } public void showPeople(){ System.out.println("==== 已存储人员信息 ===="); for (int i =0 ; i< personCount ; i++){ System.out.println(people[i]); } if (personCount == 0) { System.out.println("暂无存储人员"); } } public void addPerson(Scanner r) { if (personCount >= people.length) { System.out.println("人员存储已满,无法添加新人员"); return; } int nId; String name; int nTel; System.out.println("请输入身份证号:"); while (!r.hasNextInt()) { System.out.println("请输入有效的整数身份证号!"); r.next(); } nId = r.nextInt(); r.nextLine(); // 清空换行符 System.out.println("请输入人员姓名:"); name = r.nextLine().trim(); while (name.isEmpty()) { System.out.println("姓名不能为空,请重新输入:"); name = r.nextLine().trim(); } System.out.println("请输入电话号码:"); while (!r.hasNextInt()) { System.out.println("请输入有效的整数电话号码!"); r.next(); } nTel = r.nextInt(); r.nextLine(); // 清空换行符 // 创建Person实例并存入数组 Person newPerson = new Person(); newPerson.setPerson(nId, name, nTel); people[personCount] = newPerson; personCount++; System.out.println("人员添加成功!"); } }
Main类(保持原样)
import java.util.Scanner; public class Main { public static void main(String[] args) { Menu menu = new Menu(); menu.showMenu(); } }
关键修改说明
- 解决输入跳过问题:每次
nextInt()后用r.nextLine()清空换行符,统一传递同一个Scanner对象避免缓冲区混乱。 - 解决空指针异常:添加人员时先创建Person实例,再存入数组,而非直接调用null对象的方法。
- 优化添加逻辑:用
personCount计数器实现依次添加,避免覆盖数据,同时判断数组是否已满。 - 增强输入校验:拦截非整数输入、空姓名输入,提升程序稳定性。
- 优化交互逻辑:用
do-while循环实现菜单重复显示,符合系统使用场景。 - 重写toString:查看人员时展示可读信息,而非对象内存地址。
内容的提问来源于stack exchange,提问作者José Filipe Silva
相关产品推荐
相关产品推荐

