以下代码产生堆栈溢出错误,有人能告诉我原因吗?
(我知道如何修复错误,如果我在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;
}
}
}
答案 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}}重复调用自身。
我建议看看: