比較方式が一般契約に違反している!」を解決する。
MaxProp, Prophetを実行しているONEは、(JDKのバージョンによっては) "java.lang."エラーを報告して、エミュレーションを不可能にする可能性があります。
Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeLo(TimSort.java:747)
at java.util.TimSort.mergeAt(TimSort.java:483)
at java.util.TimSort.mergeCollapse(TimSort.java:410)
at java.util.TimSort.sort(TimSort.java:214)
at java.util.TimSort.sort(TimSort.java:173)
at java.util.Arrays.sort(Arrays.java:659)
at java.util.Collections.sort(Collections.java:217)
at routing.MaxPropRouter.tryOtherMessages(MaxPropRouter.java:385)
at routing.MaxPropRouter.update(MaxPropRouter.java:300)
at core.DTNHost.update(DTNHost.java:342)
at core.World.updateHosts(World.java:200)
at core.World.update(World.java:171)
at ui.DTNSimTextUI.runSim(DTNSimTextUI.java:29)
at ui.DTNSimUI.start(DTNSimUI.java:77)
at core.DTNSim.main(DTNSim.java:170)
2. 問題の原因
この問題の原因は、JDK1.6+では、すべての比較演算子が推移的であることが要求されており、例えば、A > BとB > Cがある場合、A > Cを確実に押し出さなければならない(同様に、= と < についても推移性を満たす必要がある)ことにあります。そして、The ONEのソースコードはJDK1.6をベースにしており、その要件がありません。
3. 解決方法
この問題を解決する方法は、少なくとも3つあります。
(1) JDKバージョン1.6で実行する。
(2) 通過性を満たすためのThe ONEソースコードの修正
ルータのコンパレータComparatorを変更するだけです。例えば、MaxPropComparatorをMaxPropに変更します。
private class MaxPropComparator implements Comparator<Message> { (プライベートクラス MaxPropComparator はコンパレータを実装しています)
<未定義
...
}
(3) ソースコードの再コンパイル
JDK1.6+で正しく動作するように、The ONEソースコードを再コンパイルするオプションをいくつか追加します[1]。
方法1:main関数の1行目に以下のコードを追加します。
System.setProperty("java.util.Arrays.useLegacyMergeSort", "true") を設定します。
方法2:オプション -Djava.util.Arrays.useLegacyMergeSort=true でコンパイルすると、フルJavaは以下のようにコンパイルされます。
java -Djava.util.Arrays.useLegacyMergeSort=true -d64 -Xms512m -Xmx4g -cp . :lib/ECLA.jar:lib/DTNConsoleConnection.jar core.DTNSim $*。
参考にしてください。
https://stackoverflow.com/questions/13575224/comparison-method-violates-its-general-contract-timsort-and-gridlayout
関連
-
SpringBootApplication を型解決できない。
-
Javaクラスローダーにソースコードから潜り込む
-
JavaMailのメール送信が失敗するケースとその説明の分析
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 4 at text.Division.main(Divisi
-
javaコンパイル時のエラー:不正な文字 '\ufeff' に対する解決策です。
-
スレッド "main" で例外発生 java.net.BindException: アドレスは既に使用中です。NET_Bind
-
トークンの構文エラー、構成要素の誤配置 エラーの理由
-
AptanaプラグインのEclipse4.5オンラインインストールと設定コードのヒントチュートリアル
-
SailSoftレポート例外の概要と解決策。
-
javaでPDFを生成するいくつかの方法
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
Java Exceptionが発生しました エラー解決
-
undefinedeclipse エラー。この行に複数のアノテーションが見つかりました: - 文字列を型解決に解決できない
-
IDEAがGitHubに接続し、認証情報が正しくない401、インバリダの認証データの問題を解決する。
-
GDALを使用すると、Java Runtime Environmentのプログラムエラー処理方式で致命的なエラーが検出されました。
-
Spring MVC アノテーションエラーです。引数型[java.lang.String]の名前が利用できません。
-
引数型[java.lang.String]の名前がありません..........................。.バグ処理
-
アクセス制限です。タイプ 'JPEGCodec' は API エラーではありません。
-
Java Base64→文字列相互変換、Base64→ファイル、ストリーム相互変換
-
問題が発生しました --- 文字列を型に解決することができません。
-
Javaラーニングノート-Collections.singletonListの使用法