开发者问题收集

遇到未捕获的类型错误:无法读取未定义的属性

2019-11-26
642

我有一个算法,可以修改 BattleShip 游戏的 10x10 二维数组,以随机方向放置船只。

棋盘如下所示:

var board= [
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 0
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 1
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 2
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 3
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 4
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 5
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 6
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 7
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 8
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]  // 9
];

该算法将 0 变为 1,并将一艘随机船只放置在随机索引和随机方向。数组如下所示: var array = [5, 4, 3, 3, 2] (数字代表长度,例如五个 1、四个 1 等)。该算法在大多数情况下都运行良好,并且会一直运行到数组为空为止。

问题是,我偶尔会遇到 Uncaught TypeError: Cannot read property of <some integer> undefined ,仅当尝试将船只放置在上或下方向时,因为它超出了界限。错误发生在检查所选方向是否超出范围的 if 语句中,如下所示:

// check out of bounds for UP direction
if (x - 1 < 0 || array[x - i][y] == undefined) {
  break;
}
// check out of bounds for DOWN direction
if (x + 1 > 9 || array[x + i][y] == undefined) {
  break;
}

我认为错误发生与尝试执行 array[x - i][y]array[x + i][y] 时出现的负索引有关。我以为我已经通过添加额外的 OR 检查解决了这个问题,即 x - 1 < 0x + 1 > 9 ,但我仍然遇到了这个异常。

1个回答

根据评论,问题在于 array[x + i]array[x - i] 没有边界检查。因此,对 array[x +/- i][y] 的调用会导致 无法读取未定义的属性 ... 错误。

Matt U
2019-11-26