본문 바로가기

안드로이드/Report

java.lang.IllegalArgumentException: Comparison method violates its general contract! 해결 방법

개발을 할 때 데이터 정렬을 위해 Comparator 사용이 필요할 경우가 있다. 

'java.lang.IllegalArgumentException: Comparison method violates its general contract!' 에러의 경우 Collection 사용 중 정렬을 위해 Comparator를 사용할 경우 return 값의 정의를 명확히 해줘야 한다는 내용이다.

 

해결 방법은 나와있는 그대로이다. Comparator의 return 값을 모든 상황에 맞게 전단해주는 것이다. 두 값을 비교하는 것이기 때문에 A 데이터와 B 데이터 중 한 쪽이 크거나, 혹은 두 값이 같은 경우, 모두 명시를 해줘야 하는 것이다.(Java 9에서 해당 오류가 수정되었다고 한다.)

 

아래는 kotlin.comparisons 패키지의 Comparisons.kt의 compareValues() 메서드를 발췌한 것이다.

package kotlin.comparisons

//Comparisons.kt 내 소스입니다.
...
  /**
   * Compares two nullable [Comparable] values. Null is considered less than any value.
   *
   * @sample samples.comparisons.Comparisons.compareValues
   */
  public fun <T : Comparable<*>> compareValues(a: T?, b: T?): Int {
      if (a === b) return 0
      if (a == null) return -1
      if (b == null) return 1

      @Suppress("UNCHECKED_CAST")
      return (a as Comparable<Any>).compareTo(b)
  }
...

 

 

위 코드를 보게 되면 모든 경우에 대해 리턴 값을 명시해줬다.

따라서 Comparator 구성 시 원하는 정렬 값에 맞게 return 값을 명시해줘야 에러 발생을 방지할 수 있다.