【问题标题】:Why does this provide me with a stack overflow error?为什么这会为我提供堆栈溢出错误?
【发布时间】:2013-08-17 08:52:09
【问题描述】:

以下代码产生堆栈溢出错误,有人能告诉我为什么吗? (如果我在 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;
        }

    }

}

【问题讨论】:

  • 如果您收到StackOverflowError,查看错误的堆栈跟踪应该会提供信息;使用给定的行号遍历逻辑。

标签: java stack-overflow


【解决方案1】:

这段代码永远调用自己,因此会出现 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() 的实现。

Cory Kendall 对这个问题的评论非常有价值:

如果您收到StackOverflowError,查看错误的堆栈跟踪应该会提供信息;使用给定的行号遍历逻辑。

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

我建议看看:

【讨论】:

  • OP 可能正在寻找super.add()
  • 感谢您的回答。很明显我现在做错了什么。
  • 我的目标是创建一个可以与模型一起使用的 Vector 子类,并且只允许添加某些模型,并创建一个有效的 contains 方法覆盖,以检查模型 ID 而不是对象ids,我承认,我应该能更好地理解。
猜你喜欢
  • 2019-01-09
  • 2021-06-18
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多