6 回答

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個(gè)贊
你要問的應(yīng)該是為什么編譯能通過.但還是堆棧溢出了.
編譯:只是檢測語法問題.你這個(gè)是邏輯BUG.編譯器檢查不出來的.必須要運(yùn)行起來才能知道會(huì)溢出.
編譯的時(shí)候并沒有運(yùn)行.
你需要搞清楚2個(gè)時(shí)間:編譯時(shí),運(yùn)行時(shí).就像宏命令只是編譯時(shí)生效一樣.宏命令屬于編譯時(shí).而這種代碼運(yùn)行時(shí)才會(huì)拋出的bug.屬于運(yùn)行時(shí).編譯器無能為力

TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個(gè)贊
因?yàn)槟阍贒emo類中遞歸實(shí)例引用了,所以new的時(shí)候會(huì)爆棧,改成如下:
class Demo {
static?Demo d = new Demo();
}

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超10個(gè)贊
遞歸引用,棧溢出。
IDE只檢測編譯期錯(cuò)誤,運(yùn)行時(shí)錯(cuò)誤,如樓上所說,無能為力。

TA貢獻(xiàn)1845條經(jīng)驗(yàn) 獲得超8個(gè)贊
解釋一下為什么會(huì)溢出吧:
一個(gè)類實(shí)例化的時(shí)候,會(huì)先運(yùn)行其成員變量的語句。即你在Test類中調(diào)用new Demo()的時(shí)候,實(shí)例化這個(gè)Demo的時(shí)候,會(huì)先執(zhí)行Demo類中的Demo d = new Demo()這一句,這時(shí)候又要求實(shí)例化Demo, 此時(shí)又要先執(zhí)行Demo d = new Demo(), 然后又要求實(shí)例化Demo...... 這樣就形成了死循環(huán),最終溢出。
添加回答
舉報(bào)