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

C# 如何在处理数组和ObservableCollection时解决NullReferenceException?,c#,arrays,observablecollection,nullreferenceexception,C#,Arrays,Observablecollection,Nullreferenceexception,我在代码中遇到了声明的异常。然后我在线搜索这个异常,并尽我所能,创建了一个实例,将元素添加到一个ObservableCollection中。NullException可能来自personID[0]?但对于数组,它总是从0开始。。8的数组从0到7。我不明白为什么这个异常会持续存在。你能帮我一把吗?我们将非常感谢您的帮助,并提前表示感谢 using (StreamReader file = new StreamReader(fileName)) {

我在代码中遇到了声明的异常。然后我在线搜索这个异常,并尽我所能,创建了一个实例,将元素添加到一个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++;
                }
            } 
使用(StreamReader文件=新的StreamReader(文件名))
{
if(this.PersonIdDetails==null)
PersonIdDetails=新的ObservableCollection();
其他的
this.PersonIdDetails.Clear();
var lineCount=File.ReadLines(fileName.Count();
PersonId[]PersonId=新PersonId[lineCount];
int y=0;
而(file.Peek()>=0)
{
字符串行=file.ReadLine();
如果(string.IsNullOrEmpty(line))继续;
//删除要拆分的元素的空白
行=行。替换(“,”);
字符[]字符分隔符=新字符[]{'§','�' };
string[]parts=line.Split(charseparator、StringSplitOptions.removeMptyEntries);
personId[y].QualName=parts[1];//此处抛出异常。“对象引用未设置为对象的实例”。
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个元素?谢谢您的时间。

问题在行中

PersonId[] personId = new PersonId[lineCount];
PersonId是一个类(引用类型),因此当您创建数组时,所有元素都初始化为null。您需要为每个数组元素创建一个实例

一种方法是在抛出异常的行之前插入这一行:

personId [y] = new PersonId();

为什么要阅读第[1]部分等等?它不应该从第[0]部分开始吗?因为第[0]部分是“L”,以及文件中每一行的普通代码,所以我忽略了它。调试如何?插入一些断点,点击F5按钮,看!你会看到引发异常的那一行!我设置了断点并检查了这些行。事实上,对于这些部分,没有问题。我打算在读取txt.file后在WPF中显示它。这是“人格”的问题,对吗?你为什么要使用
personId
数组?你只需在填充
PersonIdDetails
类之后将
personId
类添加到
PersonIdDetails
类中,那么数组有什么用途呢?我明白了。因此,如果数组中有200个,最好分别为每个类创建一个实例,对吗?实际上,在这之前,我的personId不是数组。但当我设置断点来检查PersonIdDetails(ObservableCollection)中保存的元素时,它总是保存当前元素。就像第三个一样,它得到了Stephen的等效名称。我将使用相同的名称“Stephen”对于所有三个元素。ObservableCollection还保存应用于personId的更改,并应用于以前保存的所有更改,对吗?@user3481276您需要在某个时间点创建200个单独的实例。您可以在主循环之前的单独循环中执行此操作,也可以在主循环中执行此操作。第二个选项对我来说似乎代码较少,但对我来说是我们的里程数可能会有所不同。@user3481276这是因为您的集合或数组中存储了许多对同一实例的引用。如果要避免这种情况,您需要创建新的单独实例。谢谢@phoog,我了解我的问题,并找出了现在对我来说最好的解决方案。=)