向多维数组添加数据:锯齿数组出现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
相关产品推荐
相关产品推荐

