2016-12-26 1 views
1

いくつかのレガシーコードを見ていて、「比較メソッドが一般的な契約に違反しています」というエラーが表示されるセクションが見つかりました。私は、このエラーは推移的ではないコードの結果だと理解していますが、正しく修正する方法を完全には理解していません。Java:IllegalArgumentException

ここにエラーの原因となるコードがあります。

private void sortHistories(List<History> histories) { 
     Collections.sort(histories, new Comparator<History>() { 

      @Override 
      public int compare(History o1, History o2) { 

       return o1 == o2 ? 0 
         : o1 == null ? -1 
         : o2 == null ? 1 
         : o1.getFamilyMembers().equals(o2.getFamilyMembers()) ? 0 //getFamilyMembers() returns a string 
         : o1.getFamilyMembers() == null ? -1 
         : o2.getFamilyMembers() == null ? 1 
         : o2.getFamilyMembers().compareTo(o2.getFamilyMembers()) != 0 ? 
           o2.getFamilyMembers().compareTo(o2.getFamilyMembers()) 
         : o1.getDisease().equals(o2.getDisease()) ? 0 //getDisease() also returns a string 
         : o1.getDisease() == null ? -1 
         : o2.getDisease() == null ? 1 
         : o1.getDisease().compareTo(o2.getDisease()); 
      } 
     }); 
    } 

文字列getDisease()getFamilyMembers()を比較するときもともと、コードが==ではなくequals()を使用していました。私は==からequals()に変更すると問題は解決すると思ったが、そうではない。

+3

あなたはo1.getDiseをチェックする必要がos.getDisease()をo2.getDisease()と比較するかどうかを比較する前にase()がnullに等しいかどうかを確認します。 – haifzhan

+1

'=='が最適化されました。下の2行、 'o2.getFamilyMembers().computTo(o2.getFamilyMembers())!= 0'は実際の作業を行います。だから '== 1 *は正しかった(そして冗長であった)。 –

+0

@HaifengZhang別のヌルチェックを移動するだけでなく、これを試しましたが、まだエラーが発生しています。私は上記の私の更新されたコードを掲載しました。 –

答えて

0

慎重にドキュメントをお読みください。この例外を実行することは、Java7の新しい機能です。ここ

詳細:: https://stackoverflow.com/a/8327575/3080158

以前の動作は、新しいシステムプロパティを設定することができます:java.util.Arrays.useLegacyMergeSort。

http://www.oracle.com/technetwork/java/javase/compatibility-417013.html#source

enter image description here

http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html

enter image description here

+0

これは例外を取り除くかもしれないことに同意しますが、ソート順は修正されません。 –

+0

はい、ソート順を修正するには、契約者に従う必要があります。すなわち、lt -1、gt 1、0に等しいです。 – RBanerjee

+0

これは明らかです。投稿されたコードを見れば、OPはどうしますか? –

2

ソリューション、HaifengZhangとYoungHobbitのおかげで、次のとおりです。

public int compare(History o1, History o2) { 
       return o1 == o2 ? 0 
         : o1 == null ? -1 
         : o2 == null ? 1 
         : o1.getFamilyMembers() == null ? -1 
         : o2.getFamilyMembers() == null ? 1 
         : o1.getFamilyMembers() == o2.getFamilyMembers() ? 0 
         : o2.getFamilyMembers().compareTo(o1.getFamilyMembers()) != 0 ? 
           o2.getFamilyMembers().compareTo(o1.getFamilyMembers()) 
         : o1.getDisease() == null ? -1 
         : o2.getDisease() == null ? 1 
         : o1.getDisease() == o2.getDisease() ? 0 
         : o1.getDisease().compareTo(o2.getDisease()); 
      }