集合排序引发异常

我正在尝试对我的用户分数进行排序。它在本地运行良好,但是当我查看服务器日志时,它会引发很多异常。所以我尝试空检查并捕获异常,但异常仍然抛出异常。我不确定有什么例外。


Collections.sort(userScores, new Comparator<UserScore>() {

            @Override

            public int compare(UserScore o1, UserScore o2) {


                try {

                    if(o1 == null || o1.getScore() == null) {

                        return 1;

                    }

                    if(o2 == null || o2.getScore() == null) {

                        return -1;

                    }

                    if(o1.getScore().doubleValue() > o2.getScore().doubleValue())

                        return -1;

                    return 1;   

                }catch(Exception ex) {

                    logger.severe(ex.getMessage());

                    return 0;

                }


            }

        });

我的代码抛出,


java.lang.IllegalArgumentException: Comparison method violates its general contract!

        at java.util.TimSort.mergeLo(TimSort.java:777) ~[na:1.8.0_181]

        at java.util.TimSort.mergeAt(TimSort.java:514) ~[na:1.8.0_181]

        at java.util.TimSort.mergeCollapse(TimSort.java:441) ~[na:1.8.0_181]

        at java.util.TimSort.sort(TimSort.java:245) ~[na:1.8.0_181]

        at java.util.Arrays.sort(Arrays.java:1438) ~[na:1.8.0_181]

        at java.util.List.sort(List.java:478) ~[na:1.8.0_181]

        at java.util.Collections.sort(Collections.java:175) ~[na:1.8.0_181]

        at com.tll.treeofwords.game.service.GameService.generateRanking(GameService.java:179) ~[classes!/:0.0.1-SNAPSHOT]

        at com.tll.treeofwords.game.service.GameService.getCurrentGame(GameService.java:76) ~[classes!/:0.0.1-SNAPSHOT]

        at com.tll.treeofwords.game.service.GameService.getCurrentGame(GameService.java:59) ~[classes!/:0.0.1-SNAPSHOT]

        at com.tll.treeofwords.game.service.GameService$$FastClassBySpringCGLIB$$d5f3b9ef.invoke(<generated>) ~[classes!/:0.0.1-SNAPSHOT]

        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.3.13.RELEASE.jar!/:4.3.13.RELEASE]


大话西游666
浏览 119回答 2
2回答

叮当猫咪

您的 Comparator 没有正确处理将两个空值视为相等的情况。如果您比较两个对象o1和o2,它们都是null,您的代码将导致:compare(o1,o2) == 1还有:_compare(o2,o1) == 1那应该是不可能的,因为o1不能同时大于和小于o2.&nbsp;因此,您看到的错误。0如果o1和o2(或它们各自的getScore()方法)都为空,则需要修改代码以返回。

浮云间

无论传递给覆盖compare方法的参数顺序如何,它都会给出相同的结果。假设我们有o1.getScore().doubleValue() == o2.getScore().doubleValue().&nbsp;然后compare(o1, o2) == 1 && compare(o2, o1) == 1。的约定compare是对于每对参数o1和o2,以下必须为真:compare(o1, o2) + compare(o2, o1) == 0。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java