java.lang.IllegalArgumentException:比较方法违反了在java7中给出Error的一般契约

时间:2016-05-10 10:34:58

标签: java

在此代码result = myDef.getRank() - inDef.getRank();中 我得到了java.lang.IllegalArgumentException:比较方法违反了它的一般合同!

以下是代码段。请帮我解决这个问题。

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;
}

2 个答案:

答案 0 :(得分:1)

myDef.getRank() - inDef.getRank()方法中使用减法compareTo通常是一种不好的做法,因为它可能导致整数溢出问题。有关here的更多信息,请参阅。

这有两个有问题的部分:

  1. result = myDef.getRank() - inDef.getRank(); - 它有整数溢出问题。您可以像这样修复:result = new Integer(myDef.getRank()).compareTo(inDef.getRank());
  2. if (inObj instanceof OmsFeatureFacade) { - 如果您实施Comparable<OmsFeatureFacade>(注意泛型),那么您可以跳过此部分。

  3.  3。

答案 1 :(得分:0)

很难说你的代码有什么问题。原因可能在compareTo方法的其余部分或getRank()实现中。

我只建议您检查compareTo实施的这条规则:

  

实现者必须确保sgn(x.compareTo(y))==   -sgn(y.compareTo(x))表示所有x和y。 (这意味着如果y.compareTo(x)抛出一个x.compareTo(y)必须抛出异常   异常。)

     

实现者还必须确保关系是可传递的:   (x.compareTo(y)&gt; 0&amp; y.compareTo(z)&gt; 0)表示x.compareTo(z)&gt; 0.

     

最后,实现者必须确保x.compareTo(y)== 0暗示   对于所有z,sgn(x.compareTo(z))== sgn(y.compareTo(z))。

     

在前面的描述中,符号sgn(表达式)表示   数学符号函数,定义为返回其中之一   -1,0或1根据表达式的值是负数,零还是正数。