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

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

求教一個堆棧溢出的問題

求教一個堆棧溢出的問題

繁星點點滴滴 2018-12-07 07:16:23
class Demo {   Demo d = new Demo(); } class Test { ? Demo d = new Demo();//編譯通過   main() { ? ? ? ? ? ?new Demo();//堆棧溢出   } } 如上代碼 ,為什么Test類main方法中的會報錯,但是成員中的編譯通過呢
查看完整描述

6 回答

?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

你要問的應該是為什么編譯能通過.但還是堆棧溢出了.

編譯:只是檢測語法問題.你這個是邏輯BUG.編譯器檢查不出來的.必須要運行起來才能知道會溢出.

編譯的時候并沒有運行.

你需要搞清楚2個時間:編譯時,運行時.就像宏命令只是編譯時生效一樣.宏命令屬于編譯時.而這種代碼運行時才會拋出的bug.屬于運行時.編譯器無能為力

查看完整回答
反對 回復 2018-12-16
?
心有法竹

TA貢獻1866條經驗 獲得超5個贊

因為你在Demo類中遞歸實例引用了,所以new的時候會爆棧,改成如下:

class Demo {

  static?Demo d = new Demo();

}

查看完整回答
反對 回復 2018-12-16
?
梵蒂岡之花

TA貢獻1900條經驗 獲得超5個贊

不好意思 這個遞歸是怎么發生的 很多人都跟我這么解釋,搞不太懂

查看完整回答
反對 回復 2018-12-16
?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

遞歸引用,棧溢出。

IDE只檢測編譯期錯誤,運行時錯誤,如樓上所說,無能為力。

查看完整回答
反對 回復 2018-12-16
?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

一直new下去?

查看完整回答
反對 回復 2018-12-16
?
精慕HU

TA貢獻1845條經驗 獲得超8個贊

解釋一下為什么會溢出吧:

一個類實例化的時候,會先運行其成員變量的語句。即你在Test類中調用new Demo()的時候,實例化這個Demo的時候,會先執行Demo類中的Demo d = new Demo()這一句,這時候又要求實例化Demo, 此時又要先執行Demo d = new Demo(), 然后又要求實例化Demo...... 這樣就形成了死循環,最終溢出。

查看完整回答
反對 回復 2018-12-16
  • 6 回答
  • 0 關注
  • 620 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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