我有一个Vehicle类,只要我有一个Vehicle对象列表就需要对它进行排序。我已经实现了Comparable接口并覆盖了compareTo()方法。
它可以工作,但偶尔应用程序崩溃(这是一个Android应用程序)。我得到的错误是java.lang.IllegalArgumentException: Comparison method violates its general contract!
。
这里是compareTo()方法的代码:
//this is used as a comparison criteria when using the Collections.sort() method on a Vehicle list
@Override
public int compareTo(@NonNull Object o) {
Vehicle v = (Vehicle) o;
try {
if (this.getVehicleParameters().getMainSwitch().equals("on") && v.getVehicleParameters().getMainSwitch().equals("on")) {
if (this.getVehicleId().compareTo(v.getVehicleId()) > 0) value = 1;
else if (this.getVehicleId().compareTo(v.getVehicleId()) == 0) value = 0;
else value = -1;
} else if (this.getVehicleParameters().getMainSwitch().equals("on") && v.getVehicleParameters().getMainSwitch().equals("off")) {
value = -1;
} else if (this.getVehicleParameters().getMainSwitch().equals("off") && v.getVehicleParameters().getMainSwitch().equals("on")) {
value = 1;
} else if (this.getVehicleParameters().getMainSwitch().equals("off") && v.getVehicleParameters().getMainSwitch().equals("off")) {
if (this.getVehicleId().compareTo(v.getVehicleId()) > 0) value = 1;
else if (this.getVehicleId().compareTo(v.getVehicleId()) == 0) value = 0;
else value = -1;
}
} catch (Exception e) {
if (this.getVehicleParameters().getMainSwitch() == null) value = -1;
else value = 1;
}
return value;
}
它做的是:首先按车辆的主开关(如果发动机打开或关闭)进行排序,然后按字母顺序对其进行排序。因此,您会获得一个列表,其中包含已启动引擎的车辆,按字母顺序排序,然后在此列表的末尾是关闭引擎的车辆,按字母顺序排序。
在catch
块中,我提出了一个简单的规则,即如果当前对象的主开关为空,则返回值-1。否则,返回1.
然而,应用程序偶尔崩溃,给我错误java.lang.IllegalArgumentException: Comparison method violates its general contract!
你能看到这里的错误吗?
PS。这不是另一个问题的重复,因为我们在这里处理可能的NULL值,并且当问题出现时 - 当它进入catch块时。至少,这是唯一合理的解释。错误随机出现,可能在2分钟后,也许在30分钟后(应用程序是实时的)。