Stack overflow 堆栈溢出异常、无限循环或实际堆栈溢出
如果我将其与参数0,0,0,15一起输入,则会出现堆栈溢出异常。。这可能是什么原因?是无限递归还是对堆栈来说太多了?照明3D阵列的大小为16*16*128Stack overflow 堆栈溢出异常、无限循环或实际堆栈溢出,stack-overflow,infinite-loop,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; } li
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);
}
}
private void updateLight(int x,int y,int z,byte lightValue){
如果(lightValue==1 | |照明[x][z][y]!=-1 | |体素[x][z][y]!=0){
返回;
}
光照[x][z][y]=光照值;
如果(x-1>=0){
updateLight(x-1,y,z,--lightValue);
}
如果(x+1<照明长度){
updateLight(x+1,y,z,--lightValue);
}
如果(z-1>=0){
updateLight(x,y,z-1,--lightValue);
}
如果(z+1<照明[0]。长度){
updateLight(x,y,z+1,--lightValue);
}
如果(y-1>=0){
updateLight(x,y-1,z,--lightValue);
}
如果(y+1<照明[0][0]。长度){
updateLight(x,y+1,z,--lightValue);
}
}
看起来第一个调用将达到第二个条件,并调用updateLight(x+1,y,z,--lightValue)
是updateLight(1,0,0,14)代码>。然后,该递归调用将命中第一个条件,并调用updateLight(x-1,y,z,--lightValue)
是updateLight(0,0,0,13)代码>。由于没有任何条件依赖于lightValue,因此就流控制而言,这与第一次调用相同。所以它只是在这两个递归调用之间来回反弹,直到堆栈溢出
您应该能够在调试器中轻松验证这一点。这不是循环,而是recursion@Alex哎哟,这就是我的意思。要得到stackoverflow,它不应该是无限的,只是比你的stack还多。@Alex我知道。但我有点怀疑,当大多数操作立即被过滤时,16*16*128操作的堆栈是否会溢出。这就是为什么我要问这里是否有无限递归。你可以签入调试器