C# 访问数组时出现空引用错误

C# 访问数组时出现空引用错误,c#,.net,nullreferenceexception,C#,.net,Nullreferenceexception,我有以下课程: public class MyClass { public MyArrObj[] arrOfObj; //Array of objects } 当我尝试使用以下方式访问它时: MyClass myClass = new MyClass; myClass.arrOfObj = GetData(); 它给了我一个空的异常。如果它不是一个数组,我可以使用新的数组,但我不知道如何处理它。按照您使用GetData()方法的方式,它必须返回一个数组 这里有几种方法可以动态创建数组(

我有以下课程:

public class MyClass
{
   public MyArrObj[] arrOfObj; //Array of objects
}
当我尝试使用以下方式访问它时:

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

它给了我一个空的异常。如果它不是一个数组,我可以使用新的数组,但我不知道如何处理它。

按照您使用
GetData()
方法的方式,它必须返回一个数组

这里有几种方法可以动态创建数组(不过,您仍然需要填充它们):


干杯。

您需要这样做:

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方法是其中的重要部分。
它必须初始化一个新数组并返回它。

如果
GetData()
方法的签名看起来像
public MyArrObj[]GetData()
,那么代码应该正常工作。我使用两个版本的“GetData”方法测试了您的代码:

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

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

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

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

引用类型数组

例如,如果创建MyArrObj数组

MyArrObj[] objectArray = new MyArrObj[3];
然后,数组元素
objectArray[0]
objectArray[2]
仍然是
null
。需要单独初始化。

objectArray[0] = new MyArrObj();
只有完成上述步骤后,才能访问数组元素的成员。

objectArray[0].SomeMethod();
如果跳过数组元素初始化,则尝试访问数组元素的成员将产生
System.NullReferenceException

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


您可以使用

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

值类型数组

如果您事先知道数组,那么可以使用@clonked指出的初始化。
对于内置类型(如
int、float
、structs等)等值类型,不需要初始化每个数组元素。
例如,如果创建一个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;
}
private MyArrObj[]GetData()
{
int numberOfObjects=GetNumberOfObjects();//获取运行时的对象数
MyArrObj[]对象数组=新的MyArrObj[numberOfObjects];
for(int i=0;i

更多信息


显示堆栈跟踪。您确定NRE不在
GetData
的实现中吗?还向我们显示GetData的功能。可能的重复项
intArray [0] = 1;
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;
}