当前位置:编程学习 > JAVA >>

jdk 7 IllegalArgumentException: Comparison method violates its general contract

上次出了一个异常

 Caused by: java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeLo(TimSort.java:747)
at java.util.TimSort.mergeAt(TimSort.java:483)
at java.util.TimSort.mergeCollapse(TimSort.java:410)
at java.util.TimSort.sort(TimSort.java:214)
at java.util.TimSort.sort(TimSort.java:173)


原因就是Collections.sort()函数 经过设置 
java.util.Arrays.useLegacyMergeSort=true 异常消失了
可现在想知道在jdk7下 为什么会出现这个问题 谁可以写个demo 复现这个异常吗
这是我做的test  list有相同的引用 而且我都返回1 但没有抛任何异常

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

class Data {
public Data(int id,String name){
this.id = id;
this.name = name;
}
@Override
public String toString(){
return this.id + "->" + this.name;
}
public int id ;
public String name;
}
public class test {
public static void main(String[] args) {

Data d1 = new Data(1,"a");
Data d2 = new Data(2,"5");
Data d3 = new Data(3,"u");
Data d4 = new Data(4,"p");
Data d5 = new Data(1,"b");

List<Data> datas = new ArrayList<Data>();
datas.add(d1);
datas.add(d2);
datas.add(d3);
datas.add(d4);
datas.add(d5);
datas.add(d1);

for (int i = 0; i< 39; ++i){
datas.add(d1);
}

Collections.sort(datas,new Comparator<Data>(){
@Override
public int compare(Data o1, Data o2) {
return 1;
}
});

System.out.println(datas);
}
}
--------------------编程问答-------------------- 汗。不知道楼主现在想要做什么呀?

1.6上面的代码,没有错误的。
1.7身边没装。 帮顶吧。 --------------------编程问答-------------------- 想找一个在1.7上调用Collections.sort能抛Caused by: java.lang.IllegalArgumentException的例子
这个代码在1.7下也运行正确 --------------------编程问答-------------------- 没装jdk1.7
帮忙顶下 --------------------编程问答-------------------- 好像jdk7的TimSort算法,不支持空的排序!!
你这麽改写一下就会出错了!!
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;


class Data {
    public Data(Integer id,String name){
        this.id = id;
        this.name = name;
    }
    @Override
    public String toString(){
        return this.id + "->" + this.name;
    }
    public Integer id ;
    public String name;
}
public class test {
    public static void main(String[] args) {
        
        Data d1 = new Data(1,"a");
        Data d2 = new Data(2,"5");
        Data d3 = new Data(3,"u");
        Data d4 = new Data(4,"p");
        Data d5 = new Data(1,"b");
        Data d6 = new Data(null,"b");
        
        List<Data> datas = new ArrayList<Data>();
        datas.add(d6);
        datas.add(d1);
        datas.add(d2);
        datas.add(d3);
        datas.add(d4);
        datas.add(d6);
        datas.add(d5);
        datas.add(d1);
        datas.add(d6);
        
        for (int i = 0; i< 39; ++i){
            datas.add(d1);
        }
        datas.add(d6);
        
        Collections.sort(datas,new Comparator<Data>(){
            @Override
         // 按执行顺序号排序
  public int compare(Data o1, Data o2) {
  if (o1.id == null)return 1;
  if (o2.id == null)return -1;
  return o1.id.compareTo(o2.id);
  }

        });
        
        System.out.println(datas);
    }
}
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,