Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java IllegalArgumentException:比较方法违反了它的一般约定-意思是什么?_Java_Exception_Illegalargumentexception - Fatal编程技术网

Java IllegalArgumentException:比较方法违反了它的一般约定-意思是什么?

Java IllegalArgumentException:比较方法违反了它的一般约定-意思是什么?,java,exception,illegalargumentexception,Java,Exception,Illegalargumentexception,现在我知道之前已经有人问过关于这个主题的问题,但是我的问题并不是关于一个特定的例子 我只是想了解所述错误的含义。我在互联网上所能找到的只是基于示例的解决方案。有人能解释一下这个错误的核心是什么,什么时候会发生 我只是一个试图学习的学生,无法通过其他渠道理解这一点,所以请耐心等待我 谢谢。如果你不想要一个具体的例子,只需参考合同的规范,例如可以在比较器中找到: 一个比较函数,它对一些对象集合施加总排序。。。比较器c对一组元素S施加的顺序被称为与等于一致,当且仅当c.compare(e1,e2)==

现在我知道之前已经有人问过关于这个主题的问题,但是我的问题并不是关于一个特定的例子

我只是想了解所述错误的含义。我在互联网上所能找到的只是基于示例的解决方案。有人能解释一下这个错误的核心是什么,什么时候会发生

我只是一个试图学习的学生,无法通过其他渠道理解这一点,所以请耐心等待我


谢谢。

如果你不想要一个具体的例子,只需参考合同的规范,例如可以在比较器中找到:

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

等等。更重要的是:方法的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))意味着compare(x,z)>0

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

通常情况下,但不严格要求(比较(x,y)=0)=(x.equals(y))。一般来说,任何违反这一条件的比较国都应明确指出这一事实。推荐的语言是“注意:这个比较器强加的顺序与equals不一致。”


这些规范定义了“合同”的内容。当你违反合同,并且系统能够检测到时,你最终会出现上述异常情况。

如果你不想要一个具体的例子,只需参考合同的规范,例如在比较器中找到:

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

等等。更重要的是:方法的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))意味着compare(x,z)>0

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

通常情况下,但不严格要求(比较(x,y)=0)=(x.equals(y))。一般来说,任何违反这一条件的比较国都应明确指出这一事实。推荐的语言是“注意:这个比较器强加的顺序与equals不一致。”

这些规范定义了“合同”的内容。当您违反合同,并且系统能够检测到时,您最终会出现上述异常。

比较方法定义合同:

  • 实施者必须确保所有
    x
    y
    sgn(x.compareTo(y))==-sgn(y.compareTo(x))
    。(这意味着
    x.compareTo(y)
    必须在
    y.compareTo(x)
    引发异常时引发异常。)

  • 实现者还必须确保关系是可传递的:
    (x.compareTo(y)>0和&y.compareTo(z)>0)
    意味着
    x.compareTo(z)>0

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

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

compareTo
方法定义了合同:

  • 实施者必须确保所有
    x
    y
    sgn(x.compareTo(y))==-sgn(y.compareTo(x))
    。(这意味着
    x.compareTo(y)
    必须在
    y.compareTo(x)
    引发异常时引发异常。)

  • 实现者还必须确保关系是可传递的:
    (x.compareTo(y)>0和&y.compareTo(z)>0)
    意味着
    x.compareTo(z)>0

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

如果实现者