为了账号安全,请及时绑定邮箱和手机立即绑定

故意制作stackoverflow

故意制作stackoverflow

幕布斯6054654 2021-09-29 13:10:59
以下代码会导致计算器溢出错误:int f(){      return f();  }但是还有其他方法可以使计算器溢出错误吗?
查看完整描述

2 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

这是抛出 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+ 之间)


查看完整回答
反对 回复 2021-09-29
?
达令说

TA贡献1821条经验 获得超6个赞

如果递归深度足够大(或足够深?),任何递归方法都会产生溢出错误。你的方法是一个完美的例子,因为它会产生无限的深度。

我知道没有其他方法不包括递归,这实际上是可能的。

如果你声明一个太大的数组,你会得到一个 OutOfMemoryError,因为数组不是存储在堆栈上而是在堆上。

局部变量占用堆栈空间,但不能声明这么多局部变量(例如 int i1 = 1; int i2 = 2; ... int i99999 = 99999; ...),因为你被限制为 65536 个字符。

您可以尝试“手动”调用太多方法,例如 int f1() { return f2(); } int f2(){ return f3();} ... 但这与您已经提到的递归基本相同。

打开太多线程也不起作用,因为每个线程都分配了自己的堆栈。你只会像数组一样得到一个 OutOfMemoryError 。


查看完整回答
反对 回复 2021-09-29
  • 2 回答
  • 0 关注
  • 139 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信