Ass*_*saf 1 java stack-overflow
可能重复:
为什么我得到StackOverflowError
我使用两个课程:日期和考试.Date从三个整数设置Date对象:day,month,year; 考试从一个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));
}
Run Code Online (Sandbox Code Playgroud)
当我尝试运行代码时,我在线程"main"中得到错误Exception java.lang.StackOverflowError
该错误表示问题出现在Date类的一行上,该行检查两个日期是否相等:
public boolean equals (Date d)
{
return (this.equals(d));
}
Run Code Online (Sandbox Code Playgroud)
我会很感激知道为什么会这样.
boolean equals(Date d) {
this.equals(d);
}
Run Code Online (Sandbox Code Playgroud)
无论这个类是什么,equals方法都是完全错误的 - 它只是调用自身,而后者又调用自身,然后调用自身,无限递归,直到得到StackOverflowError.
首先:覆盖等于的正确签名是:
boolean equals(Object obj)
Run Code Online (Sandbox Code Playgroud)
具有特定于类的覆盖仅仅是......奇怪的.看起来好像有人试图委托默认的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)...... ;
}
Run Code Online (Sandbox Code Playgroud)
此外,在您实施equals()时,立即开始实施hashCode.它会让你感到悲伤.
当我覆盖equals()方法时,为什么要覆盖hashCode()?
| 归档时间: |
|
| 查看次数: |
284 次 |
| 最近记录: |