我搜索了一些同样的问题,我知道原因.但是只发生一次坠机,所以我来这里问你可能会导致什么样的事故.
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);
}
});
Run Code Online (Sandbox Code Playgroud)
错误是:
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)at java.util.Collections.sort(Collections)的.java:1883)
如您所见,我通过其time成员比较两个对象.该time是long类型.
我认为崩溃可能来自:
如果lhs并且rhs可以为null,我该怎么办?
在Android中,Long.compare()需要API 19.您可以在API 19下执行此操作:
public static int compare(long lhs, long rhs) {
return lhs < rhs ? -1 : (lhs == rhs ? 0 : 1);
}
Run Code Online (Sandbox Code Playgroud)
这两种情况都有问题.
if (lhs == null || rhs == null) return 0;
如果你有[123, null, 234],那么你比较123等于null,null等于234,并且通过传递你应该得到123等于234.但这不是你的比较器返回的东西.
这里的解决办法是要么禁止null或排序的所有nulls的底部(或顶部),即只回报0是两个都是null,否则返回1或-1(上取决于null被左或右).
return(int)(lhs.mTaskInfo.time - rhs.mTaskInfo.time);
考虑比较Integer.MAX_VALUE + 1来0.两者的区别在于Integer.MAX_VALUE + 1.将其转换为int包装Integer.MIN_VALUE.然后相反的比较应该给你- Integer.MIN_VALUE,但这又是Integer.MIN_VALUE由于溢出.
这里的解决方案是使用Long.compare(a,b).
| 归档时间: |
|
| 查看次数: |
1125 次 |
| 最近记录: |