2012-04-19 2 views
3

Можно создать дубликат:
why does my compare method throw exception — Comparison method violates its general contract!Сравнить метод бросить исключение: Метод сравнения нарушает его генподряд

Я этот код:

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

Иногда бросил это исключение :

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

Если у вас есть два элемента, когда равны a и b, вы получите compare(a, b) == -1 и compare(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? AS объясняется в 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: лучше всего использовать Javadoc с Java 7, так как Java 6 скоро будет EOL. ;) –

+0

Спасибо, только последний вопрос: как я могу поймать это исключение, используя инструкцию try/catch? – famedoro

Смежные вопросы