Comparison method violates its general contract!
自作Androidアプリのデバッグ中に見慣れぬエラーに遭遇。
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:882)
at java.util.TimSort.mergeAt(TimSort.java:499)
at java.util.TimSort.mergeForceCollapse(TimSort.java:440)
at java.util.TimSort.sort(TimSort.java:219)
at java.util.Arrays.sort(Arrays.java:1998)
at java.util.Collections.sort(Collections.java:1900)
自前で実装したComparatorが犯人なのはすぐ分かったんですが、具体的に何がマズいのか調べてみました。
- Comparatorが矛盾した結果を返すと起きる
- Java7で採用されたTimSortは高速な代わりに厳密さを求めるようになったのでエラーになる
- Java6以下だと起きない
ということのようです。
今回のComparator実装は比較対象のオブジェクトがnullになったときの結果が厳密じゃありませんでした。 取り急ぎ比較対象にnullが来ないようにして凌いでいます。いつかちゃんと直さないとなあ。
参考情報はこちら。
おススメ