首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >集合排序引发异常

集合排序引发异常
EN

Stack Overflow用户
提问于 2019-02-12 03:23:53
回答 2查看 512关注 0票数 1

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

代码语言:javascript
复制
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;
                }

            }
        });

我的代码抛出,

代码语言:javascript
复制
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]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738) ~[spring-aop-4.3.13.RELEASE.jar!/:4.3.13.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.3.13.RELEASE.jar!/:4.3.13.RELEASE]
        at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) ~[spring-tx-4.3.13.RELEASE.jar!/:4.3.13.RELEASE]
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282) ~[spring-tx-4.3.13.RELEASE.jar!/:4.3.13.RELEASE]
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[spring-tx-4.3.13.RELEASE.jar!/:4.3.13.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.13.RELEASE.jar!/:4.3.13.RELEASE]
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673) ~[spring-aop-4.3.13.RELEASE.jar!/:4.3.13.RELEASE]
        at com.tll.treeofwords.game.service.GameService$$EnhancerBySpringCGLIB$$38f6aa6d.getCurrentGame(<generated>) ~[classes!/:0.0.1-SNAPSHOT]
        at com.tll.treeofwords.game.controller.GameController.getGame(GameController.java:59) ~[classes!/:0.0.1-SNAPSHOT]
        at com.tll.treeofwords.game.controller.GameController$$FastClassBySpringCGLIB$$b9539785.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]
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:669) ~[spring-aop-4.3.13.RELEASE.jar!/:4.3.13.RELEASE]
        at com.tll.treeofwords.game.controller.GameController$$EnhancerBySpringCGLIB$$388a70ef.getGame(<generated>) ~[classes!/:0.0.1-SNAPSHOT]
        at sun.reflect.GeneratedMethodAccessor145.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181]
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-4.3.13.RELEASE.jar!/:4.3.13.RELEASE]
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) ~[spring-web-4.3.13.RELEASE.jar!/:4.3.13.RELEASE]
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97) ~[spring-webmvc-4.3.13.RELEASE.jar!/:4.3.13.RELEASE]
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) ~[spring-webmvc-4.3.13.RELEASE.jar!/:4.3.13.RELEASE]
EN

回答 2

Stack Overflow用户

发布于 2019-02-12 05:22:11

您的比较器不能正确处理将两个null视为相等的情况。如果您比较两个对象o1o2,这两个对象都是null,您的代码将导致:

compare(o1,o2) == 1

还有也叫

compare(o2,o1) == 1

这应该是不可能的,因为o1不能同时比o2大和小。因此,您所看到的错误。

如果o1o2 (或它们各自的getScore()方法)都为空,则需要修改代码以返回0

票数 3
EN

Stack Overflow用户

发布于 2019-02-12 03:33:14

无论传递给被覆盖的compare方法的参数的顺序如何,它都会给出相同的结果。假设我们有o1.getScore().doubleValue() == o2.getScore().doubleValue()。然后是compare(o1, o2) == 1 && compare(o2, o1) == 1compare的约定是,对于每一对参数o1o2,必须满足以下条件:compare(o1, o2) + compare(o2, o1) == 0

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54637672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档