WinForm添加客户时因PhoneNo验证抛出System.NullException,求助排查
解决你的NullReferenceException问题
嘿,这个空引用异常的原因我一眼就看出来了——咱们仔细瞅一眼Customer类里PhoneNo属性的setter逻辑:
public string PhoneNo { get { return phoneNo; } set { if (phoneNo.Length != 10) { // 这里就是问题根源! throw new ArgumentOutOfRangeException(nameof(value), value, $"{nameof(PhoneNo)} must be 10 digits long"); } phoneNo = value; } }
当你第一次给PhoneNo赋值的时候,phoneNo这个私有字段还是null状态呢,你直接去访问它的Length属性,这不就触发NullReferenceException了嘛!而且更关键的是,你要验证的应该是传入的新值value的长度,而不是原来的旧字段啊!
修复方案
修改Customer类的PhoneNo属性setter,先检查传入的value是否合法,再赋值:
public class Customer { public string FirstName { get; } public string LastName { get; } public string Address { get; } private string phoneNo; public Customer(string firstName, string lastName, string address, string phoneNo) { FirstName = firstName; LastName = lastName; Address = address; PhoneNo = phoneNo; } public string PhoneNo { get { return phoneNo; } set { // 先检查value是否为null或空字符串 if (string.IsNullOrEmpty(value)) { throw new ArgumentNullException(nameof(value), $"{nameof(PhoneNo)}不能为null或空值"); } // 再验证长度是否为10位 if (value.Length != 10) { throw new ArgumentOutOfRangeException(nameof(value), value, $"{nameof(PhoneNo)}必须是10位数字"); } // 可选:额外验证是否全为数字,避免输入非数字字符 if (!value.All(char.IsDigit)) { throw new ArgumentException($"{nameof(PhoneNo)}只能包含数字", nameof(value)); } phoneNo = value; } } }
额外优化建议
另外,在窗体的按钮点击事件里,最好先对文本框的输入做基础校验,避免把空内容传给Customer构造函数,同时加上异常捕获给用户友好提示:
private void addCustomerDetailsButton_Click(object sender, EventArgs e) { // 先检查所有输入框是否为空 if (string.IsNullOrEmpty(firstNameTextBox.Text) || string.IsNullOrEmpty(lastNameTextBox.Text) || string.IsNullOrEmpty(AddressTextBox.Text) || string.IsNullOrEmpty(customerPhoneTextBox.Text)) { MessageBox.Show("请填写完整的客户信息!"); return; } string firstName = firstNameTextBox.Text; string lastName = lastNameTextBox.Text; string address = AddressTextBox.Text; string phoneNo = customerPhoneTextBox.Text; try { customer = new Customer(firstName, lastName, address, phoneNo); MessageBox.Show("客户信息添加成功!"); } catch (Exception ex) { MessageBox.Show($"添加失败:{ex.Message}"); } }
这样不仅能解决空引用问题,还能让整个输入流程更健壮,用户体验也更好~
内容的提问来源于stack exchange,提问作者A Glove
相关产品推荐
相关产品推荐

