指数数组的边界之外。即使我试图阻止它

时间:2018-10-21 05:23:50

标签: c# indexoutofboundsexception

while (worldY != WorldHeight) { //3rd pass (Filling in rough terrain)
    while (worldX != WorldWidth) {
        if (worldY > 0) {
            if (world[worldX, worldY-1] == 1) { world[worldX, worldY] = 1; }
            if (worldX > 0) {
                if (world[worldX-1, worldY-1] == 1) { world[worldX, worldY] = 1; }
            }
            if (worldX < WorldWidth) {
                if (world[worldX+1, worldY-1] == 1) { world[worldX, worldY] = 1; }
            }
        }
        if (worldX > 0) {
            if (world[worldX-1, worldY] == 1) { world[worldX, worldY] = 1; }
        }
        if (worldX < WorldWidth) {
            if (world[worldX+1, worldY] == 1) { world[worldX, worldY] = 1; }
        }
        worldX++;
    }
    worldX = 0;
    worldY++;
}

我已经解决了一段时间,问了我的朋友和互联网,但是为什么每次到达这里都会忽略我最初的if语句,而直接针对那些我不希望出现的语句但只是一直给我一个System.IndexOutOfRangeException:索引超出了数组的范围。 即使我放了看起来应该可以防止的代码。

有什么建议吗?或替代代码?

1 个答案:

答案 0 :(得分:2)

如果认为问题出在以下逻辑方面:

if (worldX < WorldWidth) {
    if (world[worldX+1, worldY] == 1) { world[worldX, worldY] = 1; }
}

在这里,您要检查worldX是否小于WorldWidth,然后使用worldX + 1。但这并不安全。考虑一下WorldWidth为6且worldX为5的情况。然后,您的检查通过,但是worldX + 1然后为6,并导致IndexOutOfBoundsException

正确的处理方式是:

if ((worldX + 1) < WorldWidth) {
    if (world[worldX+1, worldY] == 1) { world[worldX, worldY] = 1; }
}

同一问题在您的代码中两次出现,因此一旦修复了这些问题,它便会按预期工作。

作为一个建议,我建议使用while (index < length)代替while (index != length)。尽管两者都在这种情况下起作用,但是如果您后来由于某种原因决定将索引加2,则如果索引恰巧跳过了length的确切值,您可能会陷入无限循环。