有人能告诉我什么是Java中的StackOverflowError?什么是Java中的StackOverflowError?什么时候发生?
回答
当太多的数据被放置在stack,这是一种有限的资源时,会发生堆栈溢出。
下面是一个例子:
public class Overflow {
public static final void main(String[] args) {
main(args);
}
}
这个函数调用自身多次与没有终止条件。因此,堆栈填满是因为每次调用都必须在堆栈上推送一个返回地址,但返回地址永远不会从堆栈弹出,因为该函数永远不会返回,它只会不断调用它自己。
通常当递归方法被调用的次数太多时。例如:
public void doSomething(int time)
{
System.out.println("do #" + (doSomething(time++)));
}
在Java中没有像StackOverFlowException
这样的东西。
有,然而,一个名为StackOverflowError
和the documentation类说:
时发生堆栈溢出,因为应用程序递归太深而引发。
如果你不知道堆栈是什么,这样说的:Call stack
每次调用一个函数,一小块特殊的内存区域 - 栈 - 被分配给它,并持有局部变量和函数的上下文。如果我们的函数调用另一个函数,那么下一个函数将被切断,等等。当函数再次返回时,堆栈会缩小。如果嵌套级别太高,可能会溢出。
这是一个非常普遍的概念。在Java上,超过堆栈大小时会引发StackOverflowError
。这是一个错误,而不是例外,因为你被要求避免这种情况,不能从中恢复。
典型的例子是无限递归:
public void foo(int i) {
return foo(i+1);
}
Java的机器分配程序的内存特定数量。错误是由程序使用太多内存引起的。上面的例子很好,但是如果你正在尝试创建一个非常大的数组,并且可能导致它溢出。 您可以通过使用命令行参数
java -Xmx200m YOUR_PROGRAM_CLASS
这将减少你得到一个StackOverFlowException的机会分配更多的内存(200MB的这个例子中)到你的程序。
This Explains the command line options
(http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/java.html#Xms)
-1:即使存在大量堆内存,StackOverflowError也会发生 – 2010-06-17 19:08:50
但是错误的根本原因仍然相同,内存太多。您可以通过增加堆大小或更改程序来更有效地使用内存来解决此问题。 – Lee 2010-06-17 21:52:16
- 1. 什么时候发生?
- 2. 什么时候会发生?
- 3. 什么时候发生SKErrorClientInvalid?
- 4. 什么时候发生NullPointerException?
- 5. 什么时候StackOverflowError被抛出?
- 6. 什么是编组?什么时候发生什么事情“被编组?”?
- 7. PDO SQLite是什么时候诞生的?
- 8. Clojure的生日是什么时候?
- 9. 什么时候发生HTTPS握手?
- 10. 什么时候TDE解密发生
- 11. 什么时候绑定实际发生
- 12. RoR生成的文件 - 这是什么时候发生的?
- 13. 这是为什么产生一个StackOverflowError
- 14. 什么时候生成MSIL?
- 15. 什么时候WindowStartupLocation生效
- 16. 什么时候是K 1024,什么时候是1000?
- 17. 什么时候和为什么没有实现(java.lang.reflect.InvocationTargetException)发生?
- 18. .Net观察者模式更改。这是什么时候发生的?为什么?
- 19. 什么时候注入构造函数,什么时候是CDI
- 20. Android:为什么两个onConfigurationChanged()事件在旋转时发生,布局的大小是什么时候发生的?
- 21. 什么时候在Java中设置mutate?
- 22. 什么时候在Java中使用“this”
- 23. 什么时候/为什么相互左递归在Antlr中发生?
- 24. 什么是Scala中的清单,什么时候需要它?
- 25. 什么是C++中的“set”?他们什么时候有用?
- 26. 什么时候分支和什么时候是错误的时间?
- 27. 什么时候'System.ExecutionEngineException'ocurs?
- 28. 为什么会发生? java
- 29. 程序在select()中中止。什么时候可以发生?
- 30. 什么时候应该使用let {},什么时候只是简单的!= null
给我力量.... – 2010-06-17 11:12:59
是谷歌坏了? – 2010-06-17 11:13:19
这个问题让我惊讶于代表114的代表。 – 2010-06-17 11:14:16