运行出现java.lang.StackOverflowError错误,请指教

Narcist 2008-01-29 10:27:31

//接口X
interface X
{
public void run();
}
//实现接口X的一个类
class I implements X
{
X x;
public I()
{
this.x=new I(); //Exception in thread "main" java.lang.StackOverflowError
}
public I(X x)
{
this.x=x;
}
public void start()
{
x.run();
}
public void run()
{

}
}
//实现接口X的一个类
class A implements X
{
public void run()
{
System.out.println("A");
}
}
//继承类I的类
class B extends I
{
public void run()
{
System.out.println("B");
}
}

public class Q
{
public static void main(String[] args)
{
new I(new A()).start();
new B().start();
}
}
为什么this.x=x;这句没有出错而this.x=new I(); 出错了?
java.lang.StackOverflowError是什么错误?
线程Thread类的构造函数Thread()和Thread(Runnable target)内部是怎么写的(想象)
...全文
28937 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
asdfgcjw 2011-08-26
  • 打赏
  • 举报
回复
学习了,不过还是没能解决问题
liuhuiyan1989 2010-10-10
  • 打赏
  • 举报
回复
学习……
hequhecong126317 2010-07-07
  • 打赏
  • 举报
回复
学习了~~~
zswanz 2009-09-11
  • 打赏
  • 举报
回复
我采用了递归调用,所以也出现这种情况,真奇怪,比着别人的程序改的,人家的没事,我的就不行!
Element 2009-09-04
  • 打赏
  • 举报
回复
我也遇到这个问题了,看来我也要仔细的检查了!
zoutuo 2009-06-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 healer_kx 的回复:]
栈溢出了,JVM依然是采用栈式的虚拟机,这个和C和Pascal都是一样的。函数的调用过程都体现在堆栈和退栈上了。

你调用构造函数的“层”太多了,以致于把栈区溢出了。

通常来讲,一般栈区远远小于堆区的,因为函数调用过程往往不会多于上千层,而即便每个函数调用需要1K的空间(这个大约相当于在一个C函数内声明了256个int类型的变量),那么栈区也不过是需要1MB的空间。通常栈的大小是1-2MB的。

通常递归也不要递归的层次…
[/Quote]
原来是这样,多谢了!
Narcist 2008-01-29
  • 打赏
  • 举报
回复
谢谢大家,学习了
基础没学好
小远 2008-01-29
  • 打赏
  • 举报
回复
因为对象的创建入口是 构造函数, 构造函数会递规地"初始化"构造函数中声明的对象, 所以出现了其递规地调用自己的情况,, 直到耗尽stack.
healer_kx 2008-01-29
  • 打赏
  • 举报
回复
构造函数调用的时候会初始化你的成员,和你写到构造函数里面没有本质的区别的。

从字节码的编译上来看,这二者没有本质的区别。
Narcist 2008-01-29
  • 打赏
  • 举报
回复
X x=new I();
public I()
{

}
这样也会出像问题是为什么呢?
healer_kx 2008-01-29
  • 打赏
  • 举报
回复
栈溢出了,JVM依然是采用栈式的虚拟机,这个和C和Pascal都是一样的。函数的调用过程都体现在堆栈和退栈上了。

你调用构造函数的“层”太多了,以致于把栈区溢出了。

通常来讲,一般栈区远远小于堆区的,因为函数调用过程往往不会多于上千层,而即便每个函数调用需要1K的空间(这个大约相当于在一个C函数内声明了256个int类型的变量),那么栈区也不过是需要1MB的空间。通常栈的大小是1-2MB的。

通常递归也不要递归的层次过多,很容易溢出。
cangyue87 2008-01-29
  • 打赏
  • 举报
回复
new I()代码执行到这里,就会调用I类的构造方法public I(),但是楼主在I类的构造方法public I()中又写上了new I();

一旦I类创建对象,这个对象就会无限的把自己new下去...所以这里抛出了异常
cangyue87 2008-01-29
  • 打赏
  • 举报
回复

public I()
{
this.x=new I(); //Exception in thread "main" java.lang.StackOverflowError
}


出现这个错误是因为你在构造方法中构造自己.....

执行到这里会出现递归构造,最后stack益出.....

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧