代码示例中的堆栈溢出解释
stack overflow explanation from code sample
我在考试中看到了这个代码片段,我的第一个提示是它会抛出 WhosebugError
for (int i = 10; i > 5; i++) {
if(i == 1000) i = 10;
System.out.println(i);
}
恰好不是。从代码示例中,您能否解释一下为什么 而不是 会抛出 WhosebugError
.
要获得 WhosebugError
,您必须向调用堆栈添加内容。
您正在添加对 System.out.println
的调用,但它们不会相互堆叠,因此在任何给定时间堆栈上只会有一个调用。
现在,WhosebugError
的一个例子是递归,它不能充分解析调用堆栈上的先前条目;对于一个足够大的参数,它只是对自身进行了太多的方法调用,或者每次对自身的调用都对自身产生了超出其处理能力的调用。 (Ackermann function 就是一个臭名昭著的例子。)
如果我们这样定义阶乘:
public long factorial(long value) {
return value == 0 ? 1 : value * factorial(value - 1);
}
...并给它一个足够大的值...
System.out.println(factorial(1891279172981L));
...那么我们将没有足够的堆栈 space 来处理其中的所有 1891279172981 个条目。
此代码段会导致无限循环,但不会导致无限递归(因为您没有无限次调用自身的方法)。因此它不会导致 WhosebugError。
我在考试中看到了这个代码片段,我的第一个提示是它会抛出 WhosebugError
for (int i = 10; i > 5; i++) {
if(i == 1000) i = 10;
System.out.println(i);
}
恰好不是。从代码示例中,您能否解释一下为什么 而不是 会抛出 WhosebugError
.
要获得 WhosebugError
,您必须向调用堆栈添加内容。
您正在添加对 System.out.println
的调用,但它们不会相互堆叠,因此在任何给定时间堆栈上只会有一个调用。
现在,WhosebugError
的一个例子是递归,它不能充分解析调用堆栈上的先前条目;对于一个足够大的参数,它只是对自身进行了太多的方法调用,或者每次对自身的调用都对自身产生了超出其处理能力的调用。 (Ackermann function 就是一个臭名昭著的例子。)
如果我们这样定义阶乘:
public long factorial(long value) {
return value == 0 ? 1 : value * factorial(value - 1);
}
...并给它一个足够大的值...
System.out.println(factorial(1891279172981L));
...那么我们将没有足够的堆栈 space 来处理其中的所有 1891279172981 个条目。
此代码段会导致无限循环,但不会导致无限递归(因为您没有无限次调用自身的方法)。因此它不会导致 WhosebugError。