javaException: 比較メソッドが一般契約に違反しています!
2022-02-21 03:40:43
プロジェクトがオンライン稼働中に突然数百通の異常メールが発生し、しばらくすると自動的に正常な状態になりました。
プロジェクトの例外エラーメッセージは
比較方式が一般契約に違反する
スタックを調べた結果、例外を発生させたのはsortのcompareメソッドのオーバーライドであることがわかりました。
Webで情報を調べたり、sortのソースコードを読んだりした結果、次のような結論に達しました。
sortで書き換えたメソッドが満たすべきもの。
可逆的な比較
Comparator<Integer> c = (o1, o2) -> {
if (o1 > o2) {
return 1;
} else {
return -1;
}
};
上記のコンパレータは可逆性を満たしていないので、o1とo2が等しいとき、o1とo2を比較して、o1がo2より小さいことを示す-1を返す。しかし、2つの要素が場所を交換したとき、o1よりo2は、結果がo2がo1より小さいことを示すか-1を返す。したがって、o1<o2とo2<o1という2つの要素の入れ替わり比較が存在することになる。 この2つの結果は互いに矛盾しており、場合によっては例外が発生する可能性もある。
解決方法
この問題を本当に解決するには、多くのネット上の書き込みにあるように、単に等号条件を追加すればいいというものではありません。これは逆比較に起因する問題であり、根本的に解決する必要があるのです。
compareメソッドと逆比較を矛盾させる
つまり
アド・イコールのケースなのか、それとももっと複雑なケースがあるのかは、それぞれのビジネスによって異なります。
このバグがどのように引き起こされるかを正確に理解するには、JavaのTimSortソートについて以下のサイトを参照してください。 TimSortの説明
関連
-
エラーが報告されました。リソースの読み込みに失敗しました:サーバーは500(内部サーバーエラー)のステータスで応答しました。
-
Javaクラスローダーにソースコードから潜り込む
-
JDKの設定時にjava.dllが見つからない、java SE Runtime Environmentが見つからない問題が発生しました。
-
Eclipseプロンプトを実行する java仮想マシンを使用しない
-
Spring BootのテストメソッドFailed to load ApplicationContextの問題を解決する
-
linux run jarfile Invalid or corrupt jarfile error.
-
IDEA パッケージステートメントの欠落
-
このラインで複数のマーカーを解決する方法
-
コンピュータ教育で足りない授業、手遅れになる前に補うようにアドバイス、仕事の後の半分の努力で2倍の結果が得られる!?
-
ajaxでエクセルをアップロードする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
VMの初期化中にエラーが発生しました java/lang/NoClassDefFoundError: java/lang/Object
-
リソースの読み込みに失敗しました。サーバーはステータス500(内部サーバーエラー)で応答しました。
-
Exception: java.util.NoSuchElementException: 行が見つかりません
-
あるコードに出会いましたが、何に使うのか理解できません。 List<String> list = new ArrayList<String>() { { a
-
Java(1)仕上げの基本概念+eclipseのインストール構成
-
ブラウザでの大容量ファイルスライスアップロード(Javaサーバサイド実装)
-
Java言語プログラミング(基礎編)(第10版)練習問題解答編 第7章
-
Java静的コード解析 - 仕様チェック - checkstyle
-
スプリングセキュリティ CSRF対策
-
Spring MVC アノテーションエラーです。引数型[java.lang.String]の名前が利用できません。