StackOverflow异常,无限循环或实际堆栈溢出

时间:2014-08-25 18:29:09

标签: stack-overflow infinite-loop

如果我用参数0,0,0,15输入这个,我得到一个堆栈溢出异常..这可能是什么原因?是无限递归还是堆栈实际上太多了?照明3D阵列的尺寸为16 * 16 * 128

private void updateLight(int x, int y, int z, byte lightValue) {
    if (lightValue == 1 || lighting[x][z][y] != -1 || voxels[x][z][y] != 0) {
        return;
    }

    lighting[x][z][y] = lightValue;

    if (x - 1 >= 0) {
        updateLight(x - 1, y, z, --lightValue);
    }
    if (x + 1 < lighting.length) {
        updateLight(x + 1, y, z, --lightValue);
    }
    if (z - 1 >= 0) {
        updateLight(x, y, z - 1, --lightValue);
    }
    if (z + 1 < lighting[0].length) {
        updateLight(x, y, z + 1, --lightValue);
    }
    if (y - 1 >= 0) {
        updateLight(x, y - 1, z, --lightValue);
    }
    if (y + 1 < lighting[0][0].length) {
        updateLight(x, y + 1, z, --lightValue);
    }

}

1 个答案:

答案 0 :(得分:2)

看起来第一个调用将达到第二个条件,并调用updateLight(x + 1, y, z, --lightValue); updateLight(1, 0, 0, 14);。然后,该递归调用将达到第一个条件,并调用updateLight(x - 1, y, z, --lightValue); updateLight(0, 0, 0, 13);。由于所有条件都不依赖于lightValue,因此就流量控制而言,这与第一次调用相同。所以它只是在这两个递归调用之间来回反复,直到堆栈溢出。

您应该能够在调试器中轻松验证这一点。