java - 代码示例中的堆栈溢出解释

标签 java stack-overflow

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

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

事实并非如此。从代码示例中,您能否解释一下为什么这不会会抛出StackOverFlowError

最佳答案

要出现 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 个条目。

关于java - 代码示例中的堆栈溢出解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28228130/

相关文章:

c - 关于栈溢出的练习

c - C 函数中未声明的标识符

java - 无法通过 Java/Selenium 单击 Bootstrap 下拉菜单

java - IntelliJ Kotlin - 如何修复项目中的 "Ensure that you have a dependency on the Kotlin standard library"?

java - 在 Java 中将 HashMap 写入 JSON

java - 从配置单元 Metastore 数据库中删除锁定文件

intellij-idea - Intellij在运行PsiSearchHelper时经常崩溃

java - 子类的构造函数中的堆栈溢出错误

c# - 防止父/子层次结构中无限递归的防御代码

Java - 助记符下划线位置