C#初始化类内嵌套数组报NullReferenceException异常如何排查
空引用异常根因
代码存在两个明确问题,第一个就是触发空引用的直接原因:
- 引用类型数组初始化后元素默认为null:
DataClass是自定义引用类型,执行DataClassArray = new DataClass[bookCatogaryObject.Data.Rows.Count];时,只是开辟了对应长度的数组存储空间,每个位置的元素默认值都是null,并没有创建实际的DataClass实例。此时直接访问DataClassArray[i].collectionData,本质是在空引用上读取字段,必然抛出空引用异常。 - 循环边界存在越界隐患:当前for循环的判断条件是
i <= bookCatogaryObject.Data.Rows.Count,C#所有数组下标从0开始计数,最后一个有效下标是数组长度 - 1,当i等于数组长度时,访问Rows[i]会触发索引越界异常。
修复方案
在循环内给DataClassArray的每个索引位置先创建DataClass实例,同时修正循环边界条件,修复后代码如下:
public void GenerateCategariesData() { int rowTotal = bookCatogaryObject.Data.Rows.Count; Debug.Log("==========>******" + rowTotal); collectionCounts = new int[rowTotal]; DataClassArray = new DataClass[rowTotal]; // 修正循环边界:将 <= 替换为 <,避免越界 for (int i = 0; i < rowTotal; i++) { int itemCount = bookCatogaryObject.Data.Rows[i].String.Count; Debug.Log("==========>######" + itemCount); collectionCounts[i] = itemCount; // 先实例化当前位置的DataClass对象,再为其内部数组赋值 DataClassArray[i] = new DataClass(); DataClassArray[i].collectionData = new int[itemCount]; for (int m = 0; m < itemCount; m++) { Debug.Log(bookCatogaryObject.Data.Rows[i].String[m].CollectionTitle); } } }
注意点
- 区分值类型数组和引用类型数组的初始化差异:int、float这类值类型的数组,创建后会自动给每个元素填充默认值,可直接使用;但自定义类、数组、字符串这类引用类型的数组,创建后所有元素默认是null,必须逐个实例化后才能访问其成员。
- 遍历数组时优先使用
i < 数组长度的判断写法,从写法层面规避下标越界问题。
内容的提问来源于stack exchange,提问作者Omkar P
相关产品推荐
相关产品推荐

