以下代码会引起stackoverflow错误:
int f(){
return f();
}
但是还有其他方法可以使stackoverflow错误吗?
(提前感谢)
答案 0 :(得分: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 +之间不会出现错误)
答案 1 :(得分:0)
如果递归深度足够大(或很深?),则任何递归方法都将产生溢出错误。您的方法是一个完美的例子,因为它将产生无限的深度。
我知道,没有其他方法不包括递归,这实际上是可行的。
如果声明的数组太大,则会收到OutOfMemoryError,因为该数组不是存储在堆栈中,而是存储在堆中。
局部变量占用堆栈空间,但是您不能声明那么多局部变量(例如int i1 = 1; int i2 = 2; ... int i99999 = 99999; ...),因为您的字符数限制为65536个。
您可以尝试“手动”调用太多方法,例如int f1(){return f2(); } int f2(){return f3();} ...但这与您已经提到的递归基本上相同。
打开太多线程也不起作用,因为每个线程都被分配了自己的堆栈。您只会收到与数组类似的OutOfMemoryError。