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也可以。将它添加到编辑过的答案中。