本文介紹了致命異常:java.lang.IlLegalArgumentException:比較方法違反其常規合同的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我知道有很多類似的問題,我通過閱讀這些問題的答案得到了很大的幫助,但我不能看到我的客戶是如何面對這個問題的。而且只有一個客戶端面臨此問題。
我有一個列表,我正在使用比較器接口對該列表進行排序。您認為以下代碼有問題嗎?
private static class BiologySamplesComparator implements Comparator<BiologySample>, Serializable {
@Override
public int compare(BiologySample left, BiologySample right) {
if (left == right || (left != null && right != null && left.getSampleDateTime() == right.getSampleDateTime())) {
return 0;
}
if (left == null || left.getSampleDateTime() == null) {
return 1;
}
if (right == null || right.getSampleDateTime() == null) {
return -1;
}
return right.getSampleDateTime().compareTo(left.getSampleDateTime());
}
}
我就是這樣調用這個函數的
Collections.sort(biologySamples, new BiologySamplesComparator());
我知道這種情況下的主要問題是傳遞性。然而,我想不出是什么違反了這條規定。
這是如何getSampleDateTime()返回日期09星期五17:00:00 PDT 2021
更新
這就是我能夠解決我的問題的方法。
我希望這會有幫助,我在這個問題上被困了很長時間。
private static class BiologySamplesComparator implements Comparator<BiologySample>, Serializable {
@Override
public int compare(BiologySample left, BiologySample right) {
if (left == null) {
if (right == null) {
return 0;
} else {
return 1;
}
} else if (right == null) {
return -1;
} else if (left == right) {
return 0;
}
if (left.getSampleDateTime() == null) {
if (right.getSampleDateTime() == null) {
return 0;
} else {
return 1;
}
} else if (right.getSampleDateTime() == null) {
return -1;
} else if (left.getSampleDateTime() == right.getSampleDateTime()) {
return 0;
}
return right.getSampleDateTime().compareTo(left.getSampleDateTime());
}
}
推薦答案
我在某些情況下缺少一些條件,這就是我能夠解決問題的方法。
private static class BiologySamplesComparator implements Comparator<BiologySample>, Serializable {
@Override
public int compare(BiologySample left, BiologySample right) {
if (left == null) {
if (right == null) {
return 0;
} else {
return 1;
}
} else if (right == null) {
return -1;
} else if (left == right) {
return 0;
}
if (left.getSampleDateTime() == null) {
if (right.getSampleDateTime() == null) {
return 0;
} else {
return 1;
}
} else if (right.getSampleDateTime() == null) {
return -1;
} else if (left.getSampleDateTime() == right.getSampleDateTime()) {
return 0;
}
return right.getSampleDateTime().compareTo(left.getSampleDateTime());
}
}
Why does my compare methd throw IllegalArgumentException sometimes?
提供
這篇關于致命異常:java.lang.IlLegalArgumentException:比較方法違反其常規合同的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,