java.lang.IllegalArgumentException:比较方法违反了其一般约定,在java7中给出了错误

java.lang.IllegalArgumentException:比较方法违反了其一般约定,在java7中给出了错误,java,Java,在此代码中,result=myDef.getRank()-inDef.getRank() 我得到java.lang.IllegalArgumentException:比较方法违反了它的总合同 下面是代码片段。请帮我解决这个问题 public int compareTo(Object inObj) { int result = 0; if (inObj instanceof OmsFeatureFacade) { OmsFeatureFacade inFeature

在此代码中,
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;
}

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

我只能建议您检查以下比较规则以执行:

实施者必须确保sgn(x.compareTo(y))== -所有x和y的sgn(y.compareTo(x))。(这意味着x.compareTo(y)必须在y.compareTo(x)抛出异常时抛出异常。) 例外情况。)

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

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

在前面的描述中,符号sgn(表达式)指定 数学符号函数,定义为返回 -1、0或1,取决于表达式的值是负、零还是正


compareTo
方法中使用减法
myDef.getRank()-inDef.getRank()
通常是一种不好的做法,因为它会导致整数溢出问题。更多关于这方面的信息

这有两个问题:

  • result=myDef.getRank()-inDef.getRank()-它有整数溢出问题。您可以这样修复它:
    result=newinteger(myDef.getRank()).compareTo(inDef.getRank())
  • 如果(OmsFeatureFacade的inObj instanceof){
    -如果您实现了
    可比性
    (注意泛型),则可以跳过此部分

  • 3.
    我想你的函数永远不会返回零,这是相等的情况。请将完整的
    比较发送到
    方法。到目前为止,一切基本正常。要么
    myDef.getRank()
    要么
    inDef.getRank())
    正在返回一个不能与
    减号运算符一起使用的值,或者最有可能的比较不一致:
    a.compareTo(b)
    返回与
    b.compareTo(a)相同符号的值
    对于一些
    a
    b
    .tamas rev,请查找此方法的完整代码//这是公共int getRank(){if(rank==null){return Integer.MAX_VALUE;}return rank.intValue();}的实现@ShubhamAgrawal Integer.MAX_值加上减法是一种典型的int溢出情况。应用我建议的修复程序,这部分就可以了。@tamasrev或只是使用它来处理可能的溢出。@SashaSalauyou也可以。将它添加到编辑过的答案中。