0
点赞
收藏
分享

微信扫一扫

记录一次学习过程中遇到的StackOverflowError

ivy吖 2022-02-03 阅读 87
java

记录一次学习过程中遇到的StackOverflowError

StackOverflowError栈溢出,顾名思义:栈空间不足,溢出了
要解决我遇到的问题,首先要先理解栈空间的概念。

栈的概念

  1. 栈,也叫栈内存
    每当启动一个新线程的时候,JVM为它分配一个java栈,用来存储当前线程的栈帧。栈帧是一个内存区块,是一个有关方法和运行期数据的数据集。
      可以把栈想象成一个存放高尔夫球的圆柱状容器,而它的横截面大小刚好只有一个球大小,而每一个栈帧就是一个球。每调用一个方法时,就会产生一个栈帧并入栈。在这里插入图片描述当一个方法M1被调用的时候,就会产生一个栈帧S1,并被压入到栈中,M1方法又调用了M2方法,这个时候又产生栈帧S2也被压入栈,M2方法执行完毕后,S2栈帧先出栈,S1栈帧再出栈,遵循“先进后出”原则。而一个栈的容量是有限的,当栈中的栈帧过多,导致容量耗尽,就会抛出StackOverflowError。
  2. 分析自己的问题:弄清楚了栈和栈帧的关系后,我再来分析一下我遇到的问题。
public AdministratorServer() {
        emArr[0] = new AdministratorServer();
        emArr[0].name = "李四";
        emArr[0].level = "管理员";
        emArr[0].code = "admin";
        emArr[0].pwd = "123";
        emArr[1] = new AdministratorServer();
        emArr[1].name = "张三";
        emArr[1].level = "职员";
        emArr[1].code = "001";
        emArr[1].pwd = "123";
    }

  由于我想使用构造方法AdministratorServer();来让我在其他类下new一个AdministratorServer的对象时就直接给对象数组元素赋值。
所以当我在其他类下new一个AdministratorServer的新对象时,就会调用这个构造方法,此方法就产生一个栈帧入栈。而我的构造方法中,给元素emArr[0]赋值AdministratorServer的对象引用时,又会调用此构造方法,那它就又会形成另一栈帧入栈。。。。
这样就形成了调用此方法时,它自动的又去调用自己的死递归。

  分析简图:

public static void a(){
        a();
 }
public static void main(String[] args) {
        a();
 }

此种情况下,a() 方法将无限入栈,直至栈溢出,耗尽线程栈空间。
在这里插入图片描述

  1. 解决办法:在知道问题所在和问题原因后,就放弃了用构造方法来实现我的这个愚蠢的想法。直接在其他方法下去进行元素赋值操作就可以了。
举报

相关推荐

0 条评论