如何在处理数组和ObservableCollection时解决NullReferenceException

本文关键字:ObservableCollection 解决 NullReferenceException 数组 处理 | 更新日期: 2023-09-27 18:03:45

我在代码中遇到了上述异常。然后我在网上搜索这个异常,并做了我能做的,创建一个实例,将元素添加到ObservableCollection中。可能NullException来自personID[0]?但是对于数组,它总是从0开始…就像数组8是从0到7。我不明白为什么这个异常一直存在。你能帮帮我吗?非常感谢您的帮助,并提前感谢您。

using (StreamReader file = new StreamReader(fileName))
            {
                if (this.PersonIdDetails == null)
                    PersonIdDetails= new ObservableCollection<PersonId>();
                else
                    this.PersonIdDetails.Clear();
                var lineCount = File.ReadLines(fileName).Count();
                PersonId[] personId = new PersonId[lineCount];
                int y = 0;
                while (file.Peek() >= 0)
                {
                    string line = file.ReadLine();
                    if (string.IsNullOrEmpty(line)) continue;
                    //To remove the whitespace of the to-be-splitted-elements
                    line = line.Replace(" ", "_");
                    char[] charSeparators = new char[] { '§', '�' };
                    string[] parts = line.Split(charSeparators, StringSplitOptions.RemoveEmptyEntries);
                    personId [y].QualName = parts[1]; //the exception is throw here. "Object reference not set to an instance of an object".
                    personId [y].ID = parts[2];
                    personId [y].Use.UserUse = true;
                    GetWriteablePropertyUser(personId [y], Convert.ToInt32(parts[3]));
                    GetReadablePropertyUser(personId [y], Convert.ToInt32(parts[3]));
                    PersonIdDetails .Add(personId [y]);
                    y++;
                }
            } 

从代码中可以看出,我在数组中编写了一个实例"PersonId[] PersonId = new PersonId[lineCount];"来解决异常,但问题仍然存在。如果是因为y = 0,这意味着如果我有一个120个元素的数组,那么我只能填充119个元素?感谢您的宝贵时间。

如何在处理数组和ObservableCollection时解决NullReferenceException

问题在这一行

PersonId[] personId = new PersonId[lineCount];

PersonId是一个类(引用类型),所以当您创建数组时,所有元素都初始化为null。您需要为每个数组元素创建一个实例。

一种方法是将这一行插入到抛出异常的行之前:
personId [y] = new PersonId();