2016-05-10 7 views
-2

このコードでresult = myDef.getRank() - inDef.getRank();
私はjava.lang.IllegalArgumentException:を取得しています比較メソッドは、一般的な契約に違反しています!java.lang.IllegalArgumentException:比較メソッドがjava7のエラーを与える一般的な契約に違反しています

以下はコードスニペットです。この問題を解決するのを手伝ってください。

public int compareTo(Object inObj) { 
    int result = 0; 
    if (inObj instanceof OmsFeatureFacade) { 
     OmsFeatureFacade inFeature = (OmsFeatureFacade) inObj; 

     FeatureDefinition inDef = inFeature.getFeatureDefinition(); 
     FeatureDefinition myDef = getFeatureDefinition(); 

     if ((inDef == null) || (myDef == null)) { 
      return result; 
     } 

     // Handling of primary feature. 
     if (myDef.isPrimary() != inDef.isPrimary()) { 
      if (myDef.isPrimary()) { 
       return -1; 
      } 
      if (inDef.isPrimary()) { 
       return 1; 
      } 
     } 

     // Place all bolt on features under primary 
     if (myDef.isPrimaryPricePlan() != inDef.isPrimaryPricePlan()) { 
      if (myDef.isPrimaryPricePlan()) { 
       return -1; 
      } 
      if (inDef.isPrimaryPricePlan()) { 
       return 1; 
      } 
     } 

     // Handling of SC feature. 
     if (this.isSysGeneratedFeature() != inFeature.isSysGeneratedFeature()) { 
      if (this.isSysGeneratedFeature()) { 
       return -1; 
      } 
      if (inFeature.isSysGeneratedFeature()) { 
       return 1; 
      } 
     } 

     // First Sort by rank asc, if no rank, then getRank() returns very large number. 
     result = myDef.getRank() - inDef.getRank(); 
     if (result != 0) { 
      return result; 
     } 



     // Group by price plan, and sort alpha asc. 
     result = myDef.getPricePlanCode().compareTo(inDef.getPricePlanCode()); 
     if (result != 0) { 
      return result; 
     } 

     // Handling of main feature for price plan. 
     if (this.isMainFeature() != inFeature.isMainFeature()) { 
      if (this.isMainFeature()) { 
       return -1; 
      } 
      if (inFeature.isMainFeature()) { 
       return 1; 
      } 
     } 
     // Sort alpha asc. 
     result = myDef.getDescription().compareTo(inDef.getDescription()); 
     if (result != 0) { 
      return result; 
     } 
    } 
    return result; 
} 
+1

あなたの関数は、等価の場合のゼロを返すことはないと思います。 –

+3

完全な 'compareTo'メソッドを送ってください。今のところ大丈夫です。 –

+0

'myDef.getRank()'または 'inDef.getRank()'が 'minus'演算子では使用できない値を返しています – piyushj

答えて

0

あなたのコードに間違いがあるとは言い難いです。理由は、compareToメソッドまたはgetRank()実装の残りの部分にある可能性があります。

私だけのcompareToの実装のこのルールをチェックすることをお勧めいたしますすることができます

実装はためSGN(x.compareTo(y)の)== -sgn(y.compareTo(X))を確認する必要がありますすべてxとy。 (これはy.compareTo(x)は 例外をスローするときに限りx.compareTo(y)が例外をスローしなければならないことを意味する。)

実装はまた、関係が推移的であることを確認しなければならない: (x.compareTo(Y) > 0 & & y.compareTo(z)> 0)は、x.compareTo(z)> 0を意味します。

最終的に、実装者は、すべてのzに対して、xcompareTo(y)== 0が にsgn(x.compareTo(z))== sgn(y.compareTo以上の説明では

、表記SGN(式) 式の値が負であるかに応じて -1のいずれか、0、又は1を返すように定義された数学的符号関数、ゼロまたは正の指定します。それは整数オーバーフローの問題が生じる可能性があるためcompareTo方法でsubstraction myDef.getRank() - inDef.getRank()を使用

1

は、一般的に悪い習慣です。詳しくはhereを参照してください。

は、この2つの問題の部分があります。

  1. result = myDef.getRank() - inDef.getRank(); - それは、整数オーバーフローの問題があります。 result = new Integer(myDef.getRank()).compareTo(inDef.getRank());
  2. if (inObj instanceof OmsFeatureFacade) { - Comparable<OmsFeatureFacade>(ジェネリックでは注意してください)を実装すると、この部分をスキップできます。

+0

//これはpublicの実装です。int getRank(){ if(rank == null){ return Integer.MAX_VALUE; } リターンランク。intValue(); } –

+1

@ShubhamAgrawal Integer.MAX_VALUEは、減算と組み合わされて、典型的なintオーバーフロー状況です。私が提案した修正を適用してください。この部分は問題ありません。 –

+1

@tamasrevか、['Integer.compare()'](https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html#compare-int-int-)を使用してください可能なオーバーフローも処理します。 –

関連する問題