Java中的StackOverflowError是什么?什么时候发生?

时间:2010-06-17 11:11:35

标签: java stack-overflow

有人能告诉我Java中的StackOverflowError是什么吗?

5 个答案:

答案 0 :(得分:16)

stack上有太多数据时,会发生堆栈溢出,这是一种有限的资源。

以下是一个例子:

public class Overflow {
    public static final void main(String[] args) {
        main(args);
    }
}

该函数重复调用自身,没有终止条件。因此,堆栈填满因为每个调用必须在堆栈上推送一个返回地址,但返回地址永远不会从堆栈中弹出,因为函数永远不会返回,它只是一直在调用自己。

答案 1 :(得分:8)

Java中没有StackOverFlowException这样的东西。

但是,有一个名为StackOverflowErrorthe documentation的类说:

  

当由于应用程序过于冗长而发生堆栈溢出时抛出。

如果您不知道堆栈是什么,请阅读:Call stack

答案 2 :(得分:4)

每次调用一个函数时,都会为它分配一小段特殊内存区域 - 堆栈 - 并保存局部变量和函数的上下文。如果我们的函数调用另一个函数,则下一个部分从堆栈中切除,依此类推。当函数再次返回时,堆栈会收缩。如果嵌套级别变得太高,它可能会溢出。

这是一个非常普遍的概念。在Java上,超出堆栈大小时会引发StackOverflowError。这是一个错误,而不是异常,因为我们敦促您避免这种情况,而不是从中恢复。

典型的例子是无休止的递归:

public void foo(int i) {
  return foo(i+1);
}

答案 3 :(得分:0)

通常在递归方法被调用太多次时。例如:

public void doSomething(int time)
{
  System.out.println("do #" + (doSomething(time++)));
}

答案 4 :(得分:-1)

Java机器为您的程序分配特定数量的内存。该错误是由您的程序使用太多内存引起的。上面的示例很好,但如果您尝试创建一个非常大的数组,也可能导致它溢出。 您可以使用命令行参数

为程序分配更多内存(此示例为200MB)
java -Xmx200m YOUR_PROGRAM_CLASS

这将减少您获得StackOverFlowException的可能性。

This Explains the command line options

http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/java.html#Xms