You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:42:15