You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

医疗系统医生登录触发空引用异常(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属性规范关联(推荐)

  1. 给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>();
}
  1. 初始化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"; // 给主任医生也设置账号
  1. 修改登录后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:42:01