backport

技術ネタと野球とときどき雑談

Comparison method violates its general contract!

2016/06/19
development Java

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

参考情報はこちら。



コメント欄を表示する

おススメ

WEB+DB PRESS Vol.99

特集「良いコードって何だろう?」がおススメ

WEB+DB PRESS総集編[Vol.1~84] (WEB+DB PRESS plus)

お値段手ごろなので持っておいて損なし

Kindle Paperwhite Wi-Fi、ブラック

読みたいときに読みたい本を読めるのが嬉しい

超小型65W ノートPC汎用 ACアダプター FINsix ”Dart” (シルバー)超軽量85g 11種類の変換プラグで1000機種以上のノートPCに対応 USB5V出力付きでPCとスマホ同時充電 ※必ずご使用のPCとの互換性をご確認ください。『PSE認証済』

持ち運びに便利な小型軽量のACアダプタ