当我尝试为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);
}
}
对于稍微糟糕的格式化道歉。
答案 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”所述的一个例子。 “单身人士模式”。