在此代码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;
}
答案 0 :(得分:1)
在myDef.getRank() - inDef.getRank()
方法中使用减法compareTo
通常是一种不好的做法,因为它可能导致整数溢出问题。有关here的更多信息,请参阅。
这有两个有问题的部分:
result = myDef.getRank() - inDef.getRank();
- 它有整数溢出问题。您可以像这样修复:result = new Integer(myDef.getRank()).compareTo(inDef.getRank());
if (inObj instanceof OmsFeatureFacade) {
- 如果您实施Comparable<OmsFeatureFacade>
(注意泛型),那么您可以跳过此部分。
答案 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根据表达式的值是负数,零还是正数。