Ale*_*lls 2 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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
此代码永远调用自身,因此StackOverflowError:
public boolean add(MyModelClass o){
this.add(o);
return true;
}
Run Code Online (Sandbox Code Playgroud)
在this表示当前的方法被调用的对象的实例.实际上,在此上下文中,上述代码与以下内容完全相同:
public boolean add(MyModelClass o){
add(o);
return true;
}
Run Code Online (Sandbox Code Playgroud)
这段代码完全不同:
public boolean add(MyModelClass o){
super.add(o);
return true;
}
Run Code Online (Sandbox Code Playgroud)
这不会进行递归调用.这只是调用add()基类中的实现.
科里·肯德尔对这个问题的评论非常有价值:
如果你得到一个
StackOverflowError,看看错误的堆栈跟踪应该提供信息; 使用给定的行号浏览逻辑.
异常的堆栈跟踪可以为您提供有关问题根源的大量有用信息.在这种情况下,堆栈跟踪将清楚地显示MyVectorSubClass.add()在情况下反复调用自身this.add(o).
我建议看看:
| 归档时间: |
|
| 查看次数: |
80 次 |
| 最近记录: |