Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 比较方法抛出异常:比较方法违反其一般约定_Java_Exception_Comparator_Contract - Fatal编程技术网

Java 比较方法抛出异常:比较方法违反其一般约定

Java 比较方法抛出异常:比较方法违反其一般约定,java,exception,comparator,contract,Java,Exception,Comparator,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);

可能重复:

我有以下代码:

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) 如何捕获此异常


提前感谢。

如果你有两个相等的元素
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;
类TimeComparatorTipo0实现比较器{
@凌驾
公共整数比较(DataImportedTipo0 a、DataImportedTipo0 b){
字符串Time1=a.ora,Time2=b.ora;
int cmp=时间1。与(时间2)相比;
如果(cmp==0){
//避免昂贵的操作。
Long VolTot1=Long.parseLong(总体积);
Long VolTot2=Long.parseLong(b.volume\u total);
cmp=电压1。与(电压2)相比;
}
返回cmp;

谷歌第一次对您的确切错误进行搜索,结果给出了多种解决方案以及原因。感谢您的回答,但我不明白一件事:当a和b相等时,不会进行比较(a,b)等于0?正如在中所解释的,它们应该是,但您永远不会返回0。顺便说一句:最好使用Java 7中的Javadoc,因为Java 6很快就会结束。;)谢谢,最后一个问题:如何使用try/catch语句捕获此异常?您的意思是
try{}catch(IllegalArguementException e){e.printStackTrace();}
?如果出现编程错误,则无法在运行时修复。