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

向多维数组添加数据:锯齿数组出现NullReferenceException问题求助

解决锯齿数组操作中的NullReferenceException问题

嘿,作为A-Level计算机科学学生,能尝试用锯齿数组已经很棒了!咱们来一步步拆解你遇到的NullReferenceException问题——这种错误90%的情况都是你在访问一个没初始化的引用对象,放到锯齿数组场景里,无非这几个原因:


常见错误场景&原因

举个你可能踩坑的例子:假设你创建了新的锯齿数组外层,但没给每个内层元素初始化数组,直接就往里赋值:

// 原账户锯齿数组
string[][] accounts = {
    new string[] {"STUDENT", "Alice", "S123"},
    new string[] {"STUDENT", "Charlie", "S789"}
};

// 错误:只创建了外层数组,内层每个元素都是null
string[][] studentAccounts = new string[2][];
int idx = 0;

foreach (var acc in accounts) {
    if (acc[0] == "STUDENT") {
        // 这里studentAccounts[idx]是null,直接赋值会炸!
        studentAccounts[idx][0] = acc[0];
        studentAccounts[idx][3] = "新信息";
        idx++;
    }
}

这里的核心问题是:锯齿数组的外层是一个数组的数组,你只初始化了外层的“容器”,但每个容器里的内层数组还是null,自然没法直接赋值。

另外还有一种可能:你的原锯齿数组里存在null的行,你没做判断就直接访问acc[0],也会触发异常。


正确的实现步骤

我们可以分两步走,先确保安全遍历原数组,再正确初始化新的锯齿数组:

方法1:先统计数量再初始化数组

适合严格用锯齿数组的场景:

// 原锯齿数组(可能包含null行)
string[][] accounts = new string[][] {
    new string[] {"STUDENT", "Alice", "S123"},
    new string[] {"STAFF", "Bob", "T456"},
    new string[] {"STUDENT", "Charlie", "S789"},
    null // 模拟可能存在的无效行
};

// 第一步:先统计有效学生账户的数量(避免数组大小浪费或不足)
int studentCount = 0;
foreach (var acc in accounts) {
    // 先判空,再判断账户类型,避免索引越界
    if (acc != null && acc.Length > 0 && acc[0] == "STUDENT") {
        studentCount++;
    }
}

// 第二步:初始化新的锯齿数组,外层大小等于统计的学生数
string[][] studentAccounts = new string[studentCount][];
int currentIdx = 0;

// 第三步:遍历原数组,筛选并填充新数组
foreach (var acc in accounts) {
    if (acc != null && acc.Length > 0 && acc[0] == "STUDENT") {
        // 先给当前位置创建一个新的内层数组(长度=原长度+1,用来存新信息)
        studentAccounts[currentIdx] = new string[acc.Length + 1];
        
        // 复制原账户的信息
        for (int i = 0; i < acc.Length; i++) {
            studentAccounts[currentIdx][i] = acc[i];
        }
        
        // 添加新信息到最后一位
        studentAccounts[currentIdx][acc.Length] = "ENROLLED_2024";
        
        currentIdx++;
    }
}

方法2:用List简化操作(更灵活)

如果课程允许用List,这种方式不需要提前统计数量,代码更简洁:

List<string[]> studentList = new List<string[]>();

foreach (var acc in accounts) {
    if (acc != null && acc.Length > 0 && acc[0] == "STUDENT") {
        // 创建新数组并复制原数据
        string[] newStudent = new string[acc.Length + 1];
        Array.Copy(acc, newStudent, acc.Length);
        
        // 添加新信息
        newStudent[acc.Length] = "NEW_STUDENT_INFO";
        
        studentList.Add(newStudent);
    }
}

// 最后转成锯齿数组(如果需要的话)
string[][] studentAccounts = studentList.ToArray();

排查小技巧

下次遇到NullReferenceException,直接用调试工具(比如VS的断点)看报错行的变量:

  • 看看是不是studentAccounts[currentIdx]是null?那就是没初始化内层数组
  • 看看是不是acc是null?那就是原数组里有无效的空行,没做判空处理

这样就能快速定位问题啦!

内容的提问来源于stack exchange,提问作者Oscar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:52:36