2

次のコードではスタック オーバーフロー エラーが発生します。理由を教えてください。(メソッドで「this」ではなく「super」を参照する場合、エラーを修正する方法は知っていますが、それaddが機能する理由はわかりません。)

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;
        }

    }

}
4

1 に答える 1

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()これは、基本クラスでの実装を呼び出すだけです。

この質問に対する Cory Kendall のコメントは非常に貴重です。

が表示された場合StackOverflowErrorは、エラーのスタック トレースを調べると参考になります。指定された行番号を使用してロジックをウォークスルーします。

例外のスタック トレースから、問題の原因に関する多くの有用な情報を得ることができます。この場合、スタック トレースは、MyVectorSubClass.add()が の場合に自分自身を繰り返し呼び出していることを明確に示しthis.add(o)ます。

以下をご覧になることをお勧めします。

于 2013-08-17T00:21:06.537 に答える