2012-04-19 18 views
3

可能性の重複:それはこの例外をスローときどきは、メソッドのスロー例外の比較:比較の方法は、その一般的な契約に違反し

class TimeComparatorTipo0 implements Comparator { 
@Override 
public int compare(Object a, Object b) { 
    String Time1 = ((DataImportedTipo0) a).ora; 
    Long VolTot1 = Long.parseLong(((DataImportedTipo0) a).volume_totale); 

    String Time2 = ((DataImportedTipo0) b).ora; 
    Long VolTot2 = Long.parseLong(((DataImportedTipo0) b).volume_totale); 

    if (Time1.equals(Time2)) 
    {   
     if (VolTot1.compareTo(VolTot2) > 0) 
     return 1; 
     else 
     return -1;   
    } 
    else 
     return Time1.compareTo(Time2); 
    } 
}; 


why does my compare method throw exception — Comparison method violates its general contract!

私はこのコードをしました:

java.lang.IllegalArgumentException: Comparison method violates its general contract! 
at java.util.TimSort.mergeHi(TimSort.java:868) 
at java.util.TimSort.mergeAt(TimSort.java:485) 
at java.util.TimSort.mergeForceCollapse(TimSort.java:426) 
at java.util.TimSort.sort(TimSort.java:223) 
at java.util.TimSort.sort(TimSort.java:173) 
at java.util.Arrays.sort(Arrays.java:659) 
at java.util.Collections.sort(Collections.java:217) 
at ManageUrl.DownloadUrl.StartThreadDowloadTipo0(DownloadUrl.java:893) 
at ManageUrl.DownloadUpdateWorkflow$ConsumerTipo0.run(DownloadUpdateWorkflow.java:278) 

なぜですか?

1)どうすれば避けることができますか? 2)どうすればこの例外をキャッチできますか?

ありがとうございます。

+1

あなたの正確なエラーの非常に最初のGoogleの結果、複数のソリューションだけでなく、原因を与えると、それがより効率的に行うことができます。 – Charles

答えて

5

abの2つの要素がある場合、compare(a, b) == -1compare(b, a) == -1は意味をなさないでしょう。

あなたはとコードを単純化し、

class TimeComparatorTipo0 implements Comparator<DataImportedTipo0> { 
@Override 
public int compare(DataImportedTipo0 a, DataImportedTipo0 b) { 
    String Time1 = a.ora, Time2 = b.ora; 

    int cmp = Time1.compareTo(Time2); 
    if (cmp == 0) { 
     // avoid expensive operations. 
     Long VolTot1 = Long.parseLong(a.volume_totale); 
     Long VolTot2 = Long.parseLong(b.volume_totale); 
     cmp = VolTot1.compareTo(VolTot2); 
    } 
    return cmp; 
+0

あなたの応答に感謝しますが、私は事を理解していません:aとbが等しい場合は(a、b)が0に等しい比較しない? http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Comparator.html#compare%28java.lang.Object,%20java.lang.Object%29に説明されています。 – famedoro

+1

しかし、あなたは決して0を返すことはありません。BTW:すぐにJava 6がEOLになるので、Java 7からJavadocを使用するのが最善です。 ;) –

+0

ありがとう、ちょうど最後の質問:どのようにtry/catchステートメントを使用してこの例外をキャッチできますか? – famedoro

関連する問題