Comparison method violates its general contract!

2016/06/19

自作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が来ないようにして凌いでいます。いつかちゃんと直さないとなあ。

参考情報はこちら。




おススメ