亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

故意制作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,因為數組不是存儲在堆棧上而是在堆上。

局部變量占用堆??臻g,但不能聲明這么多局部變量(例如 int i1 = 1; int i2 = 2; ... int i99999 = 99999; ...),因為你被限制為 65536 個字符。

您可以嘗試“手動”調用太多方法,例如 int f1() { return f2(); } int f2(){ return f3();} ... 但這與您已經提到的遞歸基本相同。

打開太多線程也不起作用,因為每個線程都分配了自己的堆棧。你只會像數組一樣得到一個 OutOfMemoryError 。


查看完整回答
反對 回復 2021-09-29
  • 2 回答
  • 0 關注
  • 173 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號