遇到未捕获的类型错误:无法读取未定义的属性
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 < 0
和
x + 1 > 9
,但我仍然遇到了这个异常。
1个回答
根据评论,问题在于
array[x + i]
和
array[x - i]
没有边界检查。因此,对
array[x +/- i][y]
的调用会导致
无法读取未定义的属性 ...
错误。
Matt U
2019-11-26