【问题标题】:StackOverFlowError when initializing constructor for a list初始化列表的构造函数时出现 StackOverFlowError
【发布时间】:2013-12-02 02:52:13
【问题描述】:

当我尝试为 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);

   }

 }

抱歉,格式有点蹩脚。

【问题讨论】:

  • 您正在 MyArrayList 构造函数中构造一个 MyArrayList 。这意味着它将永远构造数组列表,直到堆栈不能再容纳它为止。
  • @Radnyx - 看起来是正确的。您应该将其发布为答案。
  • @user3055864 - 如果您只想要一个类的实例,请使用单例模式..

标签: java arraylist constructor


【解决方案1】:
public MyArrayList() {

    this.test = new MyArrayList();

  }

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

【讨论】:

    【解决方案2】:

    您正在 MyArrayList 构造函数中构造一个 MyArrayList。这意味着它将永远构造数组列表(分配越来越多的内存),直到堆栈不能再容纳它为止。

    如果您只想对“MyArrayList”进行一项测试,则将其设为“静态”,如下所示:

    static MyArrayList test;

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

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

    这是“TheLostMind”所说的一个例子。 “单例模式”。

    【讨论】:

    • 在我发布答案后看到你的评论..:P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 2012-03-19
    • 2017-05-02
    • 2018-06-20
    相关资源
    最近更新 更多