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

求教一个堆栈溢出的问题

求教一个堆栈溢出的问题

繁星点点滴滴 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 关注
  • 587 浏览

添加回答

举报

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