【发布时间】:2018-03-05 07:29:57
【问题描述】:
我用谷歌搜索了一些相同的问题,我知道原因。但是崩溃只发生了一次,所以我来这里问你什么可能导致崩溃。
Collections.sort(downloadTasks, new Comparator<DownloadTask>() {
@Override
public int compare(DownloadTask lhs, DownloadTask rhs) {
if (lhs == null || rhs == null) return 0;
return (int) (lhs.mTaskInfo.time - rhs.mTaskInfo.time);
}
});
错误是:
java.lang.IllegalArgumentException:比较方法违反了它的一般约定!在 java.util.TimSort.mergeHi(TimSort.java:864) 在 java.util.TimSort.mergeAt(TimSort.java:481) 在 java.util.TimSort.mergeCollapse(TimSort.java:406) 在 java.util.TimSort.sort(TimSort.java:210) 在 java.util.TimSort.sort(TimSort.java:169) 在 java.util.Arrays.sort(Arrays.java:2010) 在 java.util.Collections.sort(Collections.java:1883)
如您所见,我通过time 成员比较了两个对象。 time 是 long 类型。
我认为崩溃可能来自:
- 将 long 转换为 int 是否会导致崩溃?
- if (lhs == null || rhs == null) return 0; 但是理论上 lhs 和 rhs 都不是 null。
编辑
如果lhs和rhs可以为null,我该怎么办?
为 Android 编辑
在 Android 中,Long.compare() 需要 API 19。您可以在 API 19 下执行此操作:
public static int compare(long lhs, long rhs) {
return lhs < rhs ? -1 : (lhs == rhs ? 0 : 1);
}
【问题讨论】:
-
什么崩溃?你会得到什么错误,什么时候,用什么代码,会发生什么,你期望会发生什么?看看How to Ask
-
正如标题所说的错误是
Comparison method violates its general contract! -
你能解释一下为什么演员阵容会导致崩溃吗? @Thilo
-
我同意你的看法。你能写出你的答案吗?
-
在减法之前尝试转换。
标签: java