故意制作stackoverflow

以下代码会导致计算器溢出错误:


int f(){  

    return f();  

}

但是还有其他方法可以使计算器溢出错误吗?


幕布斯6054654
浏览 140回答 2
2回答

守候你守候我

这是抛出 StackOverflowError 的另一种方法,而不会溢出堆栈:int f(){    throw new StackOverflowError();}另一种方法是让一个方法调用另一个方法,调用那个方法下面会产生一个 StackOverflowError:public static void main(String[] args){    testMethod();}public static void testMethod(){    testMethod2();}public static void testMethod2(){    testMethod();}从理论上讲,您可以减少堆栈大小(例如-Xss1k)并尝试通过声明太多原始变量来溢出堆栈。但是我可以设置的最小堆栈大小是 70k。否则我会收到错误消息The stack size specified is too small, Specify at least 108k(不过,错误不会出现在 80k - 107k+ 之间)

达令说

如果递归深度足够大(或足够深?),任何递归方法都会产生溢出错误。你的方法是一个完美的例子,因为它会产生无限的深度。我知道没有其他方法不包括递归,这实际上是可能的。如果你声明一个太大的数组,你会得到一个 OutOfMemoryError,因为数组不是存储在堆栈上而是在堆上。局部变量占用堆栈空间,但不能声明这么多局部变量(例如 int i1 = 1; int i2 = 2; ... int i99999 = 99999; ...),因为你被限制为 65536 个字符。您可以尝试“手动”调用太多方法,例如 int f1() { return f2(); } int f2(){ return f3();} ... 但这与您已经提到的递归基本相同。打开太多线程也不起作用,因为每个线程都分配了自己的堆栈。你只会像数组一样得到一个 OutOfMemoryError 。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java