为什么这会给我一个堆栈溢出错误?

时间:2013-08-17 00:19:31

标签: java stack-overflow

以下代码产生堆栈溢出错误,有人能告诉我原因吗? (我知道如何修复错误,如果我在add方法中引用'super'而不是'this',但我不确定为什么会这样做。)

package subclassingVector;

import java.util.Vector;

public class MyVectorSubclass extends Vector<MyModelClass> {

    public MyVectorSubclass(){
        MyModelClass m = new MyModelClass();
        m.setId(2);
        this.add(m);
        if(this.contains(m)){
        System.out.println("contains is true");
    }
    }


    public boolean add(MyModelClass o){
            this.add(o);
            return true;
    }

    public boolean contains(Object o){
            for(subclassingVector.MyModelClass mmc: this){
                if(mmc.equals((MyModelClass) o)){
                    return true;

                }
            }
        return false;
    }


    public static void main(String[] args) {

        String s = new String("SSEE");
        MyVectorSubclass m = new MyVectorSubclass();

    }

    public class MyModelClass {

        private Integer id = null;

        public MyModelClass() {
            // TODO Auto-generated constructor stub
        }

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

    }

}

1 个答案:

答案 0 :(得分:6)

此代码永远调用自身,因此StackOverflowError:

public boolean add(MyModelClass o){
    this.add(o);
    return true;
}

this表示正在调用当前方法的对象的实例。事实上,在此上下文中,上述代码与:

完全相同
public boolean add(MyModelClass o){
    add(o);
    return true;
}

这段代码完全不同:

public boolean add(MyModelClass o){
    super.add(o);
    return true;
}

这不会进行递归调用。这只是在基类中调用add()的实现。

科里·肯德尔对这个问题的评论非常有价值:

  

如果你得到StackOverflowError,那么查看错误的堆栈跟踪应该是提供信息的;使用给定的行号来完成逻辑。

异常的堆栈跟踪可以为您提供有关问题根源的大量有用信息。在这种情况下,堆栈跟踪会清楚地显示MyVectorSubClass.add()this.add(o)的情况下{{1}}重复调用自身。

我建议看看: