![](/img/trans.png)
[英]IllegalargumentException while making a custom toast in android
[英]how to avoid IllegalArgumentException while sorting in android
從上面的鏈接,我希望我能遵循被接受的答案。 我正在使用Java 6。
代碼:
public class GenericComparator implements Comparator<User> {
private static final String TAG = "java.util.Comparator.GenericComparator";
EnumComparatorObjectType mType;
public GenericComparator(EnumComparatorObjectType paramType) {
mType = paramType;
}
@Override
public int compare(User user1, User user2) {
if (user1 == null && user2 == null)
return 0;
try {
if (mType == EnumComparatorObjectType.ENUM_OBJECT_ADDRESS_BOOK_ENTRY) {
String name1 = user1.getUsername();
String name2 = user2.getUsername();
return name1.compareToIgnoreCase(name2);
} else if (mType == EnumComparatorObjectType.ENUM_OBJECT_PRESENCE) {
EnumPresence p1 = user1.getState();
EnumPresence p2 = user2.getState();
return p1.compareTo(p2);
}
} catch (Exception e) {
Logger.i(TAG, e.getMessage(), e);
}
return 0;
}
}
堆棧跟蹤 :
java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.TimSort.mergeHi(TimSort.java:864) at java.util.TimSort.mergeAt(TimSort.java:481) at java.util.TimSort.mergeForceCollapse(TimSort.java:422) at java.util.TimSort.sort(TimSort.java:219) at java.util.TimSort.sort(TimSort.java:169) at java.util.Arrays.sort(Arrays.java:2038) at java.util.Collections.sort(Collections.java:1891) at com.sample.app.adapters.BuddyListAdapter.filerContacts(BuddyListAdapter.java:144) at com.sample.app.adapters.BuddyListAdapter.notifyDataSetChanged(BuddyListAdapter.java:126) at com.sample.app.HomeActivity$2.onReceive(HomeActivity.java:325) at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:763) ... 9 more
您已經考慮了兩個條目均為null
的情況,但沒有注意一個條目為null
且另一個條目都不為null
的情況。 您使用catch (Exception ...)
也會捕獲NullPointerException
,然后返回0,這一事實掩蓋了問題。這意味着與null
相比,任何對象都將返回0(意味着null
和一個對象相等),但是非正常比較空條目。 根據此邏輯,您將得到a [1] == a [2]和a [1] == a [3],但a [2]!= a [3]。 這顯然是錯誤的,因為它不允許正確地對對象進行排序。 這就是異常消息“比較方法違反了它的一般約定”的意思。 因此,我建議不要捕獲Exception
。
我建議嘗試以下方法:
if (user1 == null || user2 == null) {
if (user1 == user2) {
// both are null
return 0;
} else if (user1 == null) {
return -1;
}
// user2 is null
return 1;
}
if (mType == EnumComparatorObjectType.ENUM_OBJECT_ADDRESS_BOOK_ENTRY) {
String name1 = user1.getUsername();
String name2 = user2.getUsername();
return name1.compareToIgnoreCase(name2);
} else if (mType == EnumComparatorObjectType.ENUM_OBJECT_PRESENCE) {
EnumPresence p1 = user1.getState();
EnumPresence p2 = user2.getState();
return p1.compareTo(p2);
} else {
throw IllegalArgumentException("Unsupported type: " + mType);
}
如果首先 mType
狀態進行比較, 然后再按名稱進行比較, 則可以擺脫mType
,第二部分(在檢查null
)將變為:
EnumPresence p1 = user1.getState();
EnumPresence p2 = user2.getState();
int comp = p1.compareTo(p2);
if (comp != 0) {
return comp;
}
String name1 = user1.getUsername();
String name2 = user2.getUsername();
return name1.compareToIgnoreCase(name2);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.