我正在尝试对我的用户分数进行排序。它在本地运行良好,但是当我查看服务器日志时,它会引发很多异常。所以我尝试空检查并捕获异常,但异常仍然抛出异常。我不确定有什么例外。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]
2 回答
叮当猫咪
TA贡献1776条经验 获得超12个赞
您的 Comparator 没有正确处理将两个空值视为相等的情况。如果您比较两个对象o1
和o2
,它们都是null
,您的代码将导致:
compare(o1,o2) == 1
还有:_
compare(o2,o1) == 1
那应该是不可能的,因为o1
不能同时大于和小于o2
. 因此,您看到的错误。
0
如果o1
和o2
(或它们各自的getScore()
方法)都为空,则需要修改代码以返回。
浮云间
TA贡献1829条经验 获得超4个赞
无论传递给覆盖compare
方法的参数顺序如何,它都会给出相同的结果。假设我们有o1.getScore().doubleValue() == o2.getScore().doubleValue()
. 然后compare(o1, o2) == 1 && compare(o2, o1) == 1
。的约定compare
是对于每对参数o1
和o2
,以下必须为真:compare(o1, o2) + compare(o2, o1) == 0
。
添加回答
举报
0/150
提交
取消