有人能告诉我Java中的StackOverflowError是什么吗?
答案 0 :(得分:16)
当stack上有太多数据时,会发生堆栈溢出,这是一种有限的资源。
以下是一个例子:
public class Overflow {
public static final void main(String[] args) {
main(args);
}
}
该函数重复调用自身,没有终止条件。因此,堆栈填满因为每个调用必须在堆栈上推送一个返回地址,但返回地址永远不会从堆栈中弹出,因为函数永远不会返回,它只是一直在调用自己。
答案 1 :(得分:8)
Java中没有StackOverFlowException
这样的东西。
但是,有一个名为StackOverflowError
和the 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)