医疗系统医生登录触发空引用异常(System.NullReferenceException)求助
医生登录触发NullReferenceException的问题排查与修复
问题根源
登录流程中,医生角色成功验证后,代码尝试通过以下逻辑获取对应Doctor对象:
var doctor = doctors.OfType<Doctor>().FirstOrDefault(d => d.Name == authenticatedUser.Username);
但初始化数据时存在属性不匹配:
- User的Username是
doctor1/doctor2 - Doctor的Name是
Dr. Smith/Dr. Johnson
两者完全不匹配,导致FirstOrDefault返回null。进入DoctorMenu后,直接访问doctor.Name和doctor.Specialty时,就会触发NullReferenceException。
修复方案
方案1:添加Username属性规范关联(推荐)
- 给
Doctor类添加Username属性,和User的账号对应:
class Doctor : Person { public string Username { get; set; } // 新增账号属性 public string Specialty { get; set; } public List<Patient> Patients { get; set; } = new List<Patient>(); }
- 初始化Doctor时设置对应的Username:
var doctor1 = new Doctor { Username = "doctor1", Name = "Dr. Smith", Specialty = "General Practitioner" }; var doctor2 = new Doctor { Username = "doctor2", Name = "Dr. Johnson", Specialty = "Surgeon" }; chiefDoctor.Username = "chiefdoctor"; // 给主任医生也设置账号
- 修改登录后的Doctor查找逻辑,用Username匹配:
else if (authenticatedUser.Role == "Doctor") { var doctor = doctors.FirstOrDefault(d => d.Username == authenticatedUser.Username); // 添加空检查,避免匹配失败时崩溃 if (doctor == null) { Console.WriteLine("无法找到对应的医生信息,请联系管理员。"); Console.ReadLine(); continue; } DoctorMenu(doctor); SaveData(); }
方案2:临时修正匹配逻辑(不推荐,仅用于快速测试)
如果不想修改类结构,可以直接让User的Username和Doctor的Name一致:
// 修改User初始化代码 users.Add(new User { Username = "Dr. Smith", Password = "password1", Role = "Doctor" }); users.Add(new User { Username = "Dr. Johnson", Password = "password2", Role = "Doctor" });
这种方式不规范,后续维护容易出问题,仅适合临时验证。
额外优化建议
- 空检查全覆盖:在
DoctorMenu开头添加空判断,提前处理异常情况:
static void DoctorMenu(Doctor doctor) { if (doctor == null) { Console.WriteLine("无效的医生身份,请重新登录。"); Console.ReadLine(); return; } // 原菜单逻辑... }
- 用枚举替代字符串角色:定义
Role枚举,避免拼写错误导致的角色判断失败:
enum Role { Admin, Doctor, ChiefDoctor } class User { public string Username { get; set; } public string Password { get; set; } public Role Role { get; set; } }
- 用ID关联身份:给User和Doctor添加唯一ID属性,通过ID关联比字符串更可靠,避免名称重复或修改导致的匹配失败。
内容的提问来源于stack exchange,提问作者60 Fps
相关产品推荐
相关产品推荐

