为什么这段代码会抛出java.lang.StackOverflowError?

时间:2014-06-04 16:49:02

标签: java stack-overflow

这是代码:

数组初始化

int candy = new int[ratings.length];

for循环

for (int i=0;i<ratings.length;i++){
    count += calculate(i);
}

计算方法

public int calculate(int num){
        if (candy[num] != 0){  //the kid's candy number has already been calculated
            return candy[num];
        } else if (type(num) == 1){  //type A
    candy[num]=1;  //store it in the array, save time for re-calculate
            return 1;
        } else if (type(num) == 2){  //type B
            candy[num] = calculate(num+1)+1;
            return candy[num];
        } else if (type(num) == 3){  //type C
            candy[num] = calculate(num-1)+1;
            return candy[num];
        } else if (type(num) == 4){  //type D
            candy[num] = max(calculate(num-1)+1, calculate(num+1)+1);
            return candy[num];
        }
        return 0;  //should never reach here
}

我在for循环中使用此计算方法,从1-12000迭代num,然后我得到了java.lang.StackOverflowError。

然后我从

更改代码
    candy[num] = calculate(num+1)+1;
    return candy[num];

    int value1 = calculate(num+1)+1;
    candy[num] = value1;
    return value1;

没有错误。我不知道为什么?请帮帮我。

1 个答案:

答案 0 :(得分:2)

你有一个递归循环。 calculate方法在几个地方使用基于num的参数调用自身。如果逻辑不正确,您最终会得到一个无限递归循环。在Java中将产生StackOverflowError

目前尚不清楚为什么会发生这种情况,因为您尚未提供所有相关代码。但是不要!你应该能够自己调试这个。

您需要在IDE中使用调试器。

  • calculate方法
  • 的开头设置断点
  • 以调试模式运行程序
  • 当程序对断点进行组织时,它将停止
  • 检查变量
  • 单步查看type正在返回的内容
  • etcetera ...