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
相关产品推荐
相关产品推荐

