java

[오류] Comparison method violates its general contract! 예외

hs_seo 2018. 4. 3. 13:35

Java 에서 배열 정렬중에 다음과 같은 오류가 발생할 때가 있다. 


Comparison method violates its general contract!


Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!

at java.util.TimSort.mergeLo(TimSort.java:773)

at java.util.TimSort.mergeAt(TimSort.java:510)

at java.util.TimSort.mergeForceCollapse(TimSort.java:453)

at java.util.TimSort.sort(TimSort.java:250)

at java.util.Arrays.sort(Arrays.java:1438)

at sdk.algo.Koi_Delivery.main(Koi_Delivery.java:83)


확인해 보면 해당 오류는 Java7 버전의 오류이고, 9 버전에서 수정된다고 한다. 

배열의 정렬중 -1, 0, 1 값이 모호하게 전달되어 객체의 우선관계가 제대로 정리가 되지 않아서 오류가 발생하는 것이다. 


나는 다음의 구문에서 오류가 발생하여 이렇게 수정하였다. 




추가적으로 값이 모호하다는 것은 다음과 같다. 


A > B 이고, B > C 이면 A > C 로 비교가 되어야 하는데 비교가 제대로 되지 않아서 그렇다. 

반환 조건에 A > C 의 결과가 -1이나 1이 아니라 0으로 반환되는 값이 있어서 그런게 아닌지 확인해 보아야 한다. 



반응형