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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 08:52:52