在初始化时,它说“对象引用未设置为对象的实例”

时间:2010-07-15 06:57:48

标签: c#

我对C#完全陌生,我遇到了一个错误,我无法猜到它为什么会发生。这是背景:

我有一个DataPair类,就是那个,一对数据(string,float)。我还有另一个类DataSet,它是一个DataPairs数组。

DataSet有两个私有成员:

private DataPair [] _datapair;
private int _size;

DataSet的构造函数不对_datapair执行任何操作,并将_size设置为0。

我用一个Append方法填充DataSet,它做了类似的事情:

public void Append(DataPair pair)
{
    _datapair[_size] = new DataPair(pair);
    _size++;
}

我从另一个方法FillFromFile:

调用Append
public void FillFromFile(string filepath)
{
    try
    {
        if (System.IO.File.Exists(filepath))
        {
            System.IO.StreamReader sr = new System.IO.StreamReader(filepath);
            string[] currentdata;
            while (sr.Peek() >= 0)
            {
                currentdata = sr.ReadLine().Replace(',', '.').Trim().Split(';');
                this.Append(new DataPair(currentdata[0],  System.Convert.ToSingle(currentdata[1])));
            }

            sr.Close();
        }
    }
    catch (Exception e)
    {
        Console.WriteLine("Error in datafile: {0}", e.ToString());
    }
}

它似乎应该有效:它为每个Append创建(新)一个新的DataPair。

但是在执行函数Append中执行以下操作时出现此错误:“对象引用未设置为对象的实例”。

发生了什么事?

谢谢!

7 个答案:

答案 0 :(得分:2)

您尚未初始化_dataPair。     _datapair = new DataPair [size];

无论如何,Append中的代码是错误的。您不能以这种方式增加数组的大小。使用List<DataPair>代替数组可能更好。

答案 1 :(得分:1)

您的代码会创建一个新的DataPair,但永远不会初始化DataPair数组。因此,datapair引用null,任何取消引用它的尝试都将导致NullReferenceException。您需要在访问它之前对其进行初始化:

_datapair = new DataPair[someSize];

我认为你会更好地使用列表,因为数组不会自动调整大小:

private readonly IList<DataPair> datapairs;

...

datapairs = new List<DataPair>();

...

datapairs.Add(new DataPair(...));

答案 2 :(得分:1)

我会像这样使用List<DataPair>

private readonly List<DataPair> _datapair = new List<DataPair>();

然后你的追加方法就变成了:

public void Append(DataPair pair)
{
    _datapair.Add(pair); 
}

答案 3 :(得分:1)

这是因为你的_dataPair数组没有实例化:

private DataPair [] _datapair = new DataPair[] { };

答案 4 :(得分:1)

可能_datapair尚未初始化。您直接调用_datapair [_size]尚未初始化。 为什么不使用Collection btw?

private List<DataPair> _datapair = new List<DataPair>();

public void Append(DataPair pair)
{
    _datapair.Add(pair);
}
然后

_size已过时,您可以使用_datapair.Count()

答案 5 :(得分:0)

使用列表而不是数组,因为您在编译时不知道您需要多少Datapair。

答案 6 :(得分:0)

您无需在DataPair中创建新的Append,因为您已在DataPair的调用中创建了Append对象,因此您只能执行此操作:

public void Append(DataPair pair)
{
    _datapair[_size] = pair;
    _size++;
}

此外,_size是不必要的,因为所有C#数组都计算其元素。你最好使用List,或者你坚持使用数组,你可以这样做:

public void Append(DataPair pair)
{
    _datapair[_datapair.Count()] = pair;
} 

并且,当Append尝试将新对象添加到不是数组的_datapair数组但是未初始化对DataPairs数组的引用时,会引发错误。因此,如下面的答案所示,您必须初始化数组,但您必须知道其最大或想要的大小:

private DataPair [] _datapair = new DataPair[10];

由于我认为你不知道大小,你应该使用List代替你的数组。

private List<DataPair> _datapair = new List<DataPair>();

public void Append(DataPair pair)
{
    _datapair.Add(pair);
}

public void FillFromFile(string filepath)
{
    try
    {
        if (System.IO.File.Exists(filepath))
        {
            System.IO.StreamReader sr = new System.IO.StreamReader(filepath);
            string[] currentdata;
            while (sr.Peek() >= 0)
            {
                currentdata = sr.ReadLine().Replace(',', '.').Trim().Split(';');
                this.Append(new DataPair(currentdata[0],  System.Convert.ToSingle(currentdata[1])));
            }

            sr.Close();
        }
    }
    catch (Exception e)
    {
        Console.WriteLine("Error in datafile: {0}", e.ToString());
    }
}

如果您想知道列表的大小,请致电_datapair.Count(),如果您想访问列表中的第4个元素_datapair[4] = null