解决java.lang.IllegalArgumentException: Comparison method violates its general contract

今天在项目里使用 Collections.sort 方法是报错了

Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!
    at java.util.TimSort.mergeHi(TimSort.java:899)
    at java.util.TimSort.mergeAt(TimSort.java:516)
    at java.util.TimSort.mergeForceCollapse(TimSort.java:457)
    at java.util.TimSort.sort(TimSort.java:254)
    at java.util.Arrays.sort(Arrays.java:1512)
    at java.util.ArrayList.sort(ArrayList.java:1456)
    at java.util.Collections.sort(Collections.java:175)
    at milo.com.javatest.JavaMainClass.main(JavaMainClass.java:59)

我的修改方案如下

public class JavaMainClass {

    public static void main(String[] args) {
        List list = new ArrayList<>();
        list.add("Y");
        list.add("F");
        list.add("L");
        list.add("Y");
        list.add("J");
        list.add("H");
        list.add("W");
        list.add("Q");
        list.add(null);
        list.add("S");
        list.add("G");
        list.add(null);
        list.add("L");
        list.add("H");
        list.add("Q");
        list.add("W");
        list.add("Y");
        list.add("X");
        list.add("M");
        list.add("Z");
        list.add("L");
        list.add("Z");
        list.add("Z");
        list.add("H");
        list.add("Y");
        list.add("X");
        list.add("Q");
        list.add("W");
        list.add("J");
        list.add("D");
        list.add("J");
        list.add("L");
        list.add("L");

        Collections.sort(list, new Comparator() {
            @Override
            public int compare(String o1, String o2) {
//                危险写法,有安全隐患
//                if (o1 == null || o2 == null) {
//                    return 0;
//                }

//                稳妥写法
                if (o1 == null && o2 == null) {
                    return 0;
                }

                if (o1 == null) {
                    return 1;
                }

                if (o2 == null) {
                    return -1;
                }

                if (!o1.matches("^[A-Za-z]+$")) {
                    if (!o2.matches("^[A-Za-z]+$")) {
                        return 0;
                    } else {
                        return 1;
                    }
                } else {
                    if (!o2.matches("^[A-Za-z]+$")) {
                        return -1;
                    } else {
                        return o1.compareTo(o2);
                    }
                }
            }
        });


        for (String s : list) {
            System.out.print(s + ",");
        }

    }
}

java对compareTo方法的注解为

问题

虽然有了官方文档的帮助,问题也得到了解决,但我仍然不是很明白为什么这个异常就出现了,希望有大神看到此贴能给小弟指点一二。

你可能感兴趣的:(解决java.lang.IllegalArgumentException: Comparison method violates its general contract)