为什么C#中调用p.Paddress.Street赋值时会报NullReferenceException空引用错误?
错误原因
System.NullReferenceException是C#开发中非常典型的空引用异常,你这次报错的直接原因是:Address和PhoneNumber都属于引用类型,C#中所有引用类型的默认值为null,也就是没有指向任何实际存在的对象实例。你执行p.Paddress.Street = Console.ReadLine()时,p实例本身已经创建完成,但它的Paddress属性还没有被赋值为实际的Address类实例,仍然是null,访问空引用的子属性就会触发该异常。同理后续的Paddress其他属性、HomeNumber、MobileNumber的属性访问也会抛出同样的错误。
结合你提供的代码逻辑来看,问题根源是你在调用Add方法之前,实例化Patient对象时,给构造函数的paddress、homenumber、mobilenumber三个参数传入了null,导致Patient对应的三个属性都为空。
解决方案
可以根据你的业务逻辑任选一种即可:
- 方案1:实例化
Patient传参时,直接新建对应空实例传入
// 调用Add方法前创建Patient的示例代码 var newPatient = new Patient("", "", ' ', ' ', DateTime.Now, 0, new Address(), new PhoneNumber(), new PhoneNumber()); Add(newPatient);
- 方案2:在
Patient构造函数中增加空保护,避免外部传空导致属性为空
public Patient(string first, string last, char gender, char married, DateTime dob, decimal money, Address paddress, PhoneNumber homenumber, PhoneNumber mobilenumber) { FirstName = first; LastName = last; Gender = gender; Married = married; DateOfBirth = dob; Expenses = money; // 空校验:如果传入参数为null则自动初始化实例 Paddress = paddress ?? new Address(); HomeNumber = homenumber ?? new PhoneNumber(); MobileNumber = mobilenumber ?? new PhoneNumber(); }
- 方案3:在
Add方法填充地址、手机号属性前,先完成实例初始化
// 放在Add方法最开头,或者放在填充地址相关属性的代码之前即可 p.Paddress ??= new Address(); p.HomeNumber ??= new PhoneNumber(); p.MobileNumber ??= new PhoneNumber();
内容的提问来源于stack exchange,提问作者MusicCodeMan
相关产品推荐
相关产品推荐

