访问阵列时出现空引用错误

时间:2011-01-29 01:00:40

标签: c# .net nullreferenceexception

我有以下课程:

public class MyClass
{
   public MyArrObj[] arrOfObj; //Array of objects
}

当我尝试使用以下方式访问它时:

MyClass myClass = new MyClass;
myClass.arrOfObj = GetData();

它给了我一个null异常。如果它不是一个数组,我可能已经新了,但我不知道如何处理它。

4 个答案:

答案 0 :(得分:2)

在创建引用类型的数组(在您的情况下为MyArrObj)时,除了为数组分配内存之外,还需要为每个数组元素分配内存(使用new运算符)本身。

参考类型数组

例如,如果您创建MyArrObj数组,

MyArrObj[] objectArray = new MyArrObj[3];

然后数组元素objectArray[0]objectArray[2]仍然是null。需要单独初始化。

objectArray[0] = new MyArrObj();

只有完成上述步骤后才能访问数组元素的成员。

objectArray[0].SomeMethod();
SomePropertyType readProperty = objectArray[0].SomeProperty;

如果跳过数组元素初始化,那么尝试访问数组元素的成员会得到System.NullReferenceException

objectArray[0].SomeMethod(); // throws NullReferenceException

,因为 objectArray[0]; null

您可以使用

进行检查
if(objectArray[0] == null)
{
    Console.WriteLine("objectArray[0] is null");
}

值类型数组

如果你事先知道了数组,那么你可以使用@clonked指出的初始化。
对于内置类型的值类型(如 int, float,结构等),您无需初始化每个数组元素 例如,如果创建一个int数组,则

int[] intArray = new int[3];

然后数组元素intArray[0]intArray[2]分配了备忘录,并且可以为它们分配值。

intArray [0] = 1;

检查您的GetData()

因此,您的GetData()方法应包含此类代码,

private MyArrObj[] GetData()
{
    int numberOfObjects = GetNumberOfObjects(); // Get the number of objects at runtime

    MyArrObj[] objectArray = new MyArrObj[numberOfObjects];

    for (int i = 0; i < numberOfObjects; i++)
    {
        objectArray[i] = new MyArrObj();
    }

    return objectArray;
}



更多信息

答案 1 :(得分:0)

您使用GetData()方法的方式必须返回数组。

这里有几种方法可以动态创建一个数组(但你仍然需要填充它们):

int[] x = new int[5] ; // create a 5-element  array of integers
int[] y = (int[]) Array.CreateInstance(typeof(int),5) ; // create a 5 element array of integers

干杯。

答案 2 :(得分:0)

你需要做这样的事情:

class Program
    {
        static void Main(string[] args)
        {
            MyClass myClass = new MyClass();
            myClass.arrOfObj = GetData();
            foreach (var item in myClass.arrOfObj)
            {
                Console.WriteLine(item.ToString());
            }

        Console.ReadLine();

    }

    private static int[] GetData()
    {
        return new int[]{1,2,3,4,5};
    }
}

public class MyClass
{
    public int[] arrOfObj; //Array of objects
}

GetData方法是重要的部分。 它必须初始化一个新数组并返回它。

答案 3 :(得分:0)

如果GetData()方法的签名看起来像public MyArrObj[] GetData(),那么您的代码应该可以正常运行。我用2个版本的'GetData'方法测试了你的代码:

public MyArrObj[] GetData()
{
    return new MyArrObj[3] { new MyArrObj(), new MyArrObj(), new MyArrObj() };
}

public MyArrObj[] GetData2()
{
    return new MyArrObj[0];
}

这两种方法都没有引发空引用异常。我怀疑你的GetData()方法中还有其他东西抛出空引用,而不是将该方法的结果分配给arrOfObj字段的操作。