代码示例中的堆栈溢出说明

时间:2015-01-30 02:06:55

标签: java stack-overflow

我在考试中看到了这段代码片段,我的第一个提示是它会抛出StackOverFlowError

for (int i = 10; i > 5; i++) {
    if(i == 1000) i = 10;
    System.out.println(i);
}

恰好是它不是。从代码示例中,您能解释为什么将抛出StackOverFlowError

2 个答案:

答案 0 :(得分:3)

要拥有StackOverflowError,您必须在调用堆栈中添加内容。

您正在添加对System.out.println的调用,但它们根本不会堆叠在一起,因此在任何给定时间只会在堆栈上进行一次调用。

现在,StackOverflowError的示例将是递归,它不能充分解析调用堆栈上的先前条目;对于一个足够大的参数,它只是有太多的方法调用自己的东西,或者为每次调用自己创建更多的调用,而不是它可以处理。 (Ackermann function是一个臭名昭着的例子。)

如果我们这样定义阶乘:

public long factorial(long value) {
    return value == 0 ? 1 : value * factorial(value - 1);
}

......并给它一个足够大的价值......

System.out.println(factorial(1891279172981L));

...然后我们将没有足够的堆栈空间来处理这些条目的所有1891279172981。

答案 1 :(得分:3)

这个片段会导致无限循环,但不会导致无限递归(因为你没有一个方法无限次地调用自己)。因此,它不会导致StackOverflowError。