2

My java code threw the following exception:

java.lang.IllegalArgumentException: Comparison method violates its general contract!

I researched the message on StackOverflow and found several questions that posted their poorly written compare methods, but I was wondering where the contract is written and what exactly does it state regarding what the compare method must do.

Ajinkya
  • 22,324
  • 33
  • 110
  • 161
birkner
  • 133
  • 9

1 Answers1

6

Looks like Java Doc have it

The implementor must ensure that sgn(compare(x, y)) == -sgn(compare(y, x)) for all x and y. (This implies that compare(x, y) must throw an exception if and only if compare(y, x) throws an exception.)

The implementor must also ensure that the relation is transitive: ((compare(x, y)>0) && (compare(y, z)>0)) implies compare(x, z)>0.

Finally, the implementor must ensure that compare(x, y)==0 implies that sgn(compare(x, z))==sgn(compare(y, z)) for all z.

It is generally the case, but not strictly required that (compare(x, y)==0) == (x.equals(y)). Generally speaking, any comparator that violates this condition should clearly indicate this fact. The recommended language is "Note: this comparator imposes orderings that are inconsistent with equals."

Ajinkya
  • 22,324
  • 33
  • 110
  • 161