初始化列表的构造函数时的StackOverFlowError

时间:2013-12-02 02:52:14

标签: java arraylist constructor

当我尝试为MyArrayList(java中的arraylist类的个人版本)编写构造函数时,我很困惑为什么我一直收到java.lang.StackOverFlow错误。我知道存在递归调用时会发生StackOverFlow错误,但对于我编写的代码,情况似乎并非如此?任何人都可以帮忙解释为什么我会收到此错误吗?

这是我的代码,我已经包含了我编写的所有构造函数,但是第一个MyArrayList()是错误在编译器中指示的那个。

public class MyArrayList<T> {

private int capacity;
private int size;
private T[] data;
**private MyArrayList<T> test;**

private T[] createArrayOfSize(int size)
{
    T[] newArray = (T[]) new Object[size];
    return newArray;

}


**public MyArrayList() {

    this.test = new MyArrayList();

  }**

 public MyArrayList (int initialCapacity) {

   test.data = createArrayOfSize(initialCapacity);

  }

 public MyArrayList(List<T> items) {


     for (int i = 0; i < items.size(); i++) {

       test.data[i] = items.get(i);

   }

 }

对于稍微糟糕的格式化道歉。

2 个答案:

答案 0 :(得分:5)

public MyArrayList() {

    this.test = new MyArrayList();

  }

这个坏男孩正在给你这个问题。每当使用“new”运算符时,都会调用对象的构造函数。现在,在构造函数中,您再次使用“new”。这个新的将再次调用你的MyArrayList构造函数(它再次使用new)。这会以递归方式进行,直到Stack上没有剩余空间。所以你得到StackOverflowError

答案 1 :(得分:2)

您正在MyArrayList构造函数中构建MyArrayList。这意味着它将永远构造数组列表(分配越来越多的内存),直到堆栈无法再保存它。

如果您只想要一次'MyArrayList'测试,那么请将其设为'静态',如下所示:

static MyArrayList test;

这样它只会在你的类的所有实例中声明一次,但是,你仍然会得到一个递归错误,因为当你构造它时,test会构造自己。要解决此问题,您需要检查null:

public MyArrayList() {
    if (test == null)
        test = new MyArrayList();
}

这是“TheLostMind”所述的一个例子。 “单身人士模式”。