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;
}