You need to enable JavaScript to run this app. C#二维对象数组触发NullReferenceException空引用异常问题
优惠活动
大模型
产品
解决方案
定价
更多

C#二维对象数组触发NullReferenceException空引用异常问题

空引用异常根因说明

你代码里抛出NullReferenceException的核心原因是交错数组的初始化流程没有完成全链路赋值:

  • 你一开始的写法participants[8][8] grid = new participants[8][];其实不符合C#语法规范——C#数组声明阶段不能直接指定数组尺寸,尺寸要在实例化环节传入,所以你实际代码里写的participants[][] grid = new participants[8][]; 仅完成了外层数组的内存分配,这一步创建的数组只是一个长度为8的容器,容器里的8个元素(每个对应一个长度为8的participants类型子数组)默认全部为null状态,没有分配实际内存空间。
  • 即使你完成了内层子数组的分配,由于participants是引用类型,C#创建引用类型数组时,所有槽位的默认值都是null,不会自动调用你写的无参构造函数实例化对象,直接访问槽位的name、contact字段就会触发空引用错误。
  • 附带的边界校验问题:你当前对Y坐标的校验范围是17,但数组下标从0开始计数,合法的Y轴下标范围是07,相当于漏了最边缘的一行方格。
修复方案

1. 补全数组全量初始化逻辑

你可以选择两种数组实现方式,任选其一即可:

方式一:保留现有交错数组(锯齿数组)写法

把初始化逻辑补完,依次分配外层空间、内层子数组空间、实例化每个槽位的对象:

// 初始化外层数组
participants[][] grid = new participants[8][];
for (int x = 0; x < 8; x++)
{
    // 给每个X轴位置分配长度为8的Y轴子数组空间
    grid[x] = new participants[8];
    // 给每个槽位实例化participants对象,避免空引用
    for (int y = 0; y < 8; y++)
    {
        grid[x][y] = new participants();
    }
}

方式二:改用普通二维多维数组

这种写法语法更简洁,适合规则的8*8固定尺寸场景:

// 直接声明8行8列的二维数组
participants[,] grid = new participants[8, 8];
// 逐槽位实例化对象
for (int x = 0; x < 8; x++)
{
    for (int y = 0; y < 8; y++)
    {
        grid[x, y] = new participants();
    }
}

2. 修正坐标校验逻辑

把Y坐标的合法范围调整为和数组下标匹配的0~7:

// 替换原来1~7的判断逻辑
if (Coord.y >= 0 && Coord.y <= 7)
{
    correct = true;
}

完成以上修改后,原来判断“方格是否已被占用”的逻辑就能正常运行:每个槽位都已经是初始化完成的空participants对象,判断name == "" && contact == ""的逻辑可以正确识别未占用的方格,不会再触发空引用。
另外补充一个小细节:你现在直接输出grid[Coord.x][Coord.y]的话,因为participants类没有重写ToString()方法,控制台只会输出类的完整命名空间名称,如果需要展示玩家信息,可以直接输出grid[Coord.x][Coord.y].name这类具体字段内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 23:45:06