2013-01-05 6 views
1

가능한 중복 : 날짜 및 시험 : 나는 두 개의 클래스를 사용하고
Why I’m getting StackOverflowErrorStackOverflowError가

. Date는 일, 월, 년의 세 가지 정수로 Date 객체를 설정합니다. Exam은 하나의 String courseName과 하나의 Date Object에서 Exam 객체를 설정합니다.

이 코드를 실행하려고 : 나는 "주"스레드에서 오류 예외 java.lang.StackOverflowError

오류 문제가에 있다고 얻을 코드를 실행하려고하면

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

을 두 날짜가 같은지 확인하는 Date 클래스의 line :

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

나는 왜 그런 일이 발생하는지 감사하게 생각합니다. 이 클래스가 무엇이든간에

답변

2

제임스가 말했듯이, return (this.equals(d)); 분명히 잘못된 것입니다. 당신의 Date 클래스를 치죠하는 년, 월, 일에 대한 속성을 가지고, 당신은 오히려

+0

는 감사보고, 그것을 매개 변수의 정적 유형이 Object 것이 중요하다 제임스의 대답을

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

주 같은 것을 시도해야한다 ,이 작품, 그리고 더 큰 문제에 대한 지금도 아이디어 전체 있어요. – Alan

+0

@ncmathsadist 절대적으로. 내 대답을 편집했습니다. – gefei

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

는, equals 메소드는 완전히 잘못된 것입니다 - 그것은 단지 차례로, 자신을 호출 당신이에 StackOverflowError를 얻을 때까지 차례로, 무한 재귀, 자신을 호출하는 한, 자신을 호출합니다.

첫째 : 오버라이드 (override)에 대한 적절한 서명이 동일입니다

boolean equals(Object obj) 

갖는 클래스 별 재정의 그냥 ... 이상한입니다. 어쩌면 누군가가 기본 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)...... ; 
} 

를 얻을. 그것은 당신이 줄을 슬픔을 저장할 것입니다.

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

관련 문제