java - 堆栈溢出错误

标签 java stack-overflow

<分区>

Possible Duplicate:
Why I’m getting StackOverflowError

我正在使用两个类:日期和考试。 Date 从三个整数设置一个 Date 对象:日、月、年; Exam 从一个 String courseName 和一个 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 中收到错误异常

错误表明问题出在 Date 类中的一行上,该类检查两个日期是否相等:

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

如果知道为什么会这样,我将不胜感激。

最佳答案

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

无论这个类是什么,equals 方法都是完全错误的 - 它只是调用自身,后者又调用自身,后者又调用自身,无限递归,直到出现 StackOverflowError。

首先:覆盖 equals 的正确签名是:

boolean equals(Object obj)

拥有类特定的覆盖只是……奇怪。看起来也许有人试图委托(delegate)给默认的 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。它会让你免于悲伤。

Why should I override hashCode() when I override equals() method?

关于java - 堆栈溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14174867/

相关文章:

r - viterbi RHmm 错误保护堆栈溢出

c++ - 将数组传递给 C++ 中的函数时如何避免堆栈溢出?

c++ - 大小为 1 MB 的数组

c++ - 为什么#include <string> 在这里防止堆栈溢出错误?

c# - 关闭表单时的 StackOverflow

java - 如何使用 GridBagLayout 在 Java Swing 中 "emulate"12 列网格

java - 如何解释 java ssl 调试输出

java - 从 jasperserver 更新报告

java - 双重比较零特殊情况?

java - 对象引用、线程和垃圾收集