java.lang.IllegalArgumentException:比较方法违反了它的一般合同 - 含义?

时间:2018-04-04 14:58:01

标签: java exception illegalargumentexception

现在我知道之前已经提出过关于这个主题的问题,但我的问题与特定的例子无关。

我只想了解所述错误的含义。我在互联网上找到的所有东西都是基于实例的解决方案。有人可以解释这个错误的核心是什么,以及什么时候可以发生?

我只是一个想要学习的学生,并且无法通过其他来源了解这一点,所以请耐心等待。

感谢。

2 个答案:

答案 0 :(得分:1)

如果您不想要一个具体示例,只需转到合同的规范,例如可以在比较器javadoc中找到:

  

一个比较函数,它对某些对象集合施加了一个总排序......比较器c对一组元素S施加的顺序被认为与equals一致,当且仅当c.compare(e1, e2)== 0与s中的每个e1和e2的e1.equals(e2)具有相同的布尔值....

等等。更重要的是:compare()方法的javadoc:

  

比较其订单的两个参数。当第一个参数小于,等于或大于第二个参数时,返回负整数,零或正整数。

     

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

     

实现者必须确保所有x和y的sgn(compare(x,y))== -sgn(compare(y,x))。 (这意味着当且仅当compare(y,x)抛出异常时,compare(x,y)必须抛出异常。)

     

实现者还必须确保关系是传递的:((compare(x,y)> 0)&&(compare(y,z)> 0))暗示比较(x,z)&gt ; 0

     

最后,实现者必须确保compare(x,y)== 0意味着所有z的sgn(compare(x,z))== sgn(compare(y,z))。

     

通常情况如此,但并非严格要求(compare(x,y)== 0)==(x.equals(y))。一般来说,任何违反此条件的比较器都应清楚地表明这一事实。推荐的语言是"注意:这个比较器强制排序与equals不一致。"

这些规范定义了"合同"是关于。当你违反合同,并且系统能够检测到合同时,你最终会遇到所述异常。

答案 1 :(得分:1)

Comparable定义了compareTo方法的合同:

  
      
  • 实施者必须确保所有sgn(x.compareTo(y)) == -sgn(y.compareTo(x))xy。 (这意味着如果x.compareTo(y)抛出异常,y.compareTo(x)必须抛出异常。)

  •   
  • 实现者还必须确保关系具有传递性:(x.compareTo(y)>0 && y.compareTo(z)>0)隐含x.compareTo(z)>0

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

  •   

如果实施者不确保这些条件,则违反合同,Comparable.compareTo方法的用户可能会报告该例外情况。