2016-11-28 6 views
-2

私はクラスを作成しました。今、私は日の2つのオブジェクトを比較して、どの日が後であるかを見たいと思います。compareToはスタックのオーバーフローを引き起こします

しかし、問題は、私は二日を比較するのcompareToを使用しようとしたとき、それはスタックオーバーフローに

の原因となるこれは私が作成した日のクラスですが、私がのcompareToを使用することはできません理由を確認するために助けてください。

public class Day implements Cloneable,Comparable<Day>{ 

private int year; 
private int month; 
private int day; 

private static final String MonthNames="JanFebMarMayJunJulAugSepOctNovDec"; 
//Constructor 
public Day(int y, int m, int d) { 
    this.year=y; 
    this.month=m; 
    this.day=d;  
} 


public void set(String sDay) 
{ 
    String[] sDayParts = sDay.split("-"); 
    this.year = Integer.parseInt(sDayParts[2]); 
    this.day = Integer.parseInt(sDayParts[0]); 
    this.month = MonthNames.indexOf(sDayParts[1])/3+1; 
} 

public Day(String sDay) 
{ 
    set(sDay); 


} 


// Return a string for the day like dd MMM yyyy 
public String toString() { 

    return day+"-"+ MonthNames.substring((month-1)*3,month*3)+ "-"+ year; 
} 



@Override 
public int compareTo(Day another) 
{ 

    return this.compareTo(another); 
} 
+6

もちろんです。すべてのcompareToメソッドは呼び出し自体です! –

答えて

4

スタックが爆発するまで無限にitseldを呼び出すメソッドがあります。

@Override 
public int compareTo(Day another) 
{ 
    return this.compareTo(another); // calls itself until the stack is exhuased 
} 

あなたが行う必要があるのは、クラスのフィールドを比較することです。例えば

@Override 
public int compareTo(Day d) { 
    int cmp = Integer.compare(year, d.year); 
    if (cmp == 0) cmp = Integer.compare(month, d.month); 
    if (cmp == 0) cmp = Integer.compare(day, d.day); 
    return cmp; 
} 
0

あなたは素晴らしい無限再帰を続けています。

@Override 
public int compareTo(Day another) 
{ 

    return this.compareTo(another); 
} 

これは再帰呼び出しです。実際にあなた自身のcompareToボディを実装する必要があります。日付を確認してください

関連する問題