1

重複の可能性:
StackOverflowErrorが発生する理由

私は2つのクラスを使用しています:日付と試験。Dateは、3つの整数(日、月、年)からDateオブジェクトを設定します。Examは、1つのStringcourseNameと1つのDateオブジェクトからExamオブジェクトを設定します。

私はこのコードを実行しようとしています:

    public Exam(String name, Date d)
    {
        courseName=name;
        examDate=new Date(d);
    }

    //**a method that checks if two dates are equal**
    public boolean equals (Date r)
    {
        return (examDate.equals(r));
    }

    public static void main(String[] args)
    {
        Date d=new Date(11,11,2011);
        String a=new String("OOP");
        Exam b=new Exam(a,d);
        Date c=new Date(11,11,2011);
        System.out.println(b.equals(c));
    }

コードを実行しようとすると、スレッド「main」でエラー例外が発生します。java.lang.StackOverflowError

エラーは、問題が2つの日付が等しいかどうかをチェックするDateクラスの行にあることを示しています。

public boolean equals (Date d)
{
    return (this.equals(d));
}

それがなぜ起こるのかを知って感謝します。

4

2 に答える 2

5
boolean equals(Date d) {
  this.equals(d); 
}

このクラスが何であれ、equalsメソッドは完全に間違っています。StackOverflowErrorが発生するまで、それ自体を呼び出し、次にそれ自体を呼び出し、次にそれ自体を呼び出し、無限に繰り返します。

まず、equalsをオーバーライドするための適切なシグネチャは次のとおりです。

boolean equals(Object obj)

クラス固有のオーバーライドを持つことはただ...奇妙です。おそらく誰かがデフォルトのequals()メソッドに委任しようとしていたようですが、それはそれがやろうとしていることではありません。

これがカスタムDateクラスの場合、equalsは次のようになります。

boolean equals(Object obj) {
  if (!obj instanceof Date) {
    return false;
  }
  Date other = (Date) obj;
  return this.field1.equals(date.field1) && this.field2.equals(date.field2)...... ;
}

また、equals()を実装するときはいつでも、hashCodeを実装する練習をしてください。それはあなたの悲しみを救うでしょう。

equals()メソッドをオーバーライドするときにhashCode()をオーバーライドする必要があるのはなぜですか?

于 2013-01-05T18:28:34.117 に答える
2

ジェームズreturn (this.equals(d));が言ったように、間違いなく間違っています。クラスDateに年、月、日の属性があるとすると、次のようなものを試してみてください。

public boolean equals(Object o) {
    if (! o instanceof Date) return false;
    Date d = (Date)o;
    return this.year == d.year && this.month == d.month && this.day == d.day;
}

パラメータの静的タイプがであることが重要であることに注意してくださいObject。Jamesの回答を参照してください。

于 2013-01-05T18:31:57.977 に答える