我有以下课程:
public class MyClass
{
public MyArrObj[] arrOfObj; //Array of objects
}
当我尝试使用以下方式访问它时:
MyClass myClass = new MyClass;
myClass.arrOfObj = GetData();
它给了我一个null异常。如果它不是一个数组,我可能已经新了,但我不知道如何处理它。
答案 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
字段的操作。