Метод сравнения нарушает его общий контракт! Только Java 7

Я знаю, что это уже давно проблема, и проверил все предыдущие ответы, которые я мог получить, но все же этот не работает.

Объект «экипаж» представляет членов экипажа со званиями и другими предметами. Сравнение должно проводиться путем сравнения «assign_rank», значения int, и если это значение равно в обоих случаях, тогда «is_trainer», логическое значение, должно иметь значение.

Этот метод работал отлично, пока он работал с java <7. Но с Java 7 я продолжаю получать этот:

java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.ComparableTimSort.mergeLo(ComparableTimSort.java:714) at java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:451) at java.util.ComparableTimSort.mergeCollapse(ComparableTimSort.java:376) at java.util.ComparableTimSort.sort(ComparableTimSort.java:182) at java.util.ComparableTimSort.sort(ComparableTimSort.java:146) at java.util.Arrays.sort(Arrays.java:472) at java.util.Collections.sort(Collections.java:155) at dormas_flightlog.Query.getCrew(Query.java:714) 

Вот источник, где некоторые потенциально опасные части уже давно не комментируются, но он все равно не работает:

 public class crew implements Serializable, Comparable { private static final long serialVersionUID = 36L; private int flightID = 0; private int assigned_rank = 25; private boolean is_trainer = false; ... @Override public int compareTo(crew him) { int myRank = this.getAssigned_rank(); int hisRank = him.assigned_rank; if (this == him) { return 0; } if (myRank > hisRank) { return 1; } if (myRank  hisRank) { return false; } if (myRank < hisRank) { return false; } if (myRank == hisRank) { // if (is_trainer && !o.is_trainer) { // i = 1; // } // if (!is_trainer && o.is_trainer) { // i = -1; // } // if (is_trainer && o.is_trainer) { // i = 0; // } // if (!is_trainer && !o.is_trainer) { // i = 0; // } return true; } return false; } 

}

Реализация equals () была просто попыткой решить эту проблему. Данное исключение поставляется с или без равенства (). Я не вижу, как метод compareTo нарушает его контракт. Любая помощь очень ценится …. В один прекрасный день этот код должен работать с java 7, и я не знаю, как … Спасибо

видеть это:

С http://www.oracle.com/technetwork/java/javase/compatibility-417013.html#source

Область: API: Утилиты Синопсис: обновленное поведение сортировки для массивов и коллекций может вызывать исключение IllegalArgumentException

Описание: Алгоритм сортировки, используемый java.util.Arrays.sort и (косвенно) с помощью java.util.Collections.sort, был заменен. Новая реализация sort может вызывать исключение IllegalArgumentException, если оно обнаруживает сравнимое, которое нарушает договор Comparable. Предыдущая реализация молча игнорировала такую ​​ситуацию. Если требуется предыдущее поведение, вы можете использовать новое системное свойство java.util.Arrays.useLegacyMergeSort, чтобы восстановить предыдущее поведение слияния.

Природа несовместимости: поведенческая

RFE: 6804124

Для получения более подробной информации см. Ссылку на базу данных ошибок здесь .

возможно, у вас есть значения NaN которые вы сравниваете с помощью Collections.sort(...) , это было проблемой для меня, и я получил это исключение, даже имея правильную реализацию метода compare(obj1, obj2) ! Проверь это!

Я смог решить эту ошибку, потому что это была ошибка в jdk7.

здесь я нашел решение:

«Метод сравнения нарушает его общий контракт!» – TimSort и GridLayout

В основном мне просто пришлось добавить

 JAVA_OPTS="$JAVA_OPTS -Djava.util.Arrays.useLegacyMergeSort=true" 

к моему jboss

К сожалению, ни одно из решений не работает для Android. TimSort используется в Android-группе ViewGroup, связанной с addChildrenForAccessibility, которая отображается в Java 7 и 8. Никакой код пользователя не участвует ни в одном сравнении.

Из других отчетов это связано с наличием RelativeLayout с перекрывающимися элементами, как это обычно делается. Например, TextView, который отображается над изображением, или два элемента в том же месте, где вы устанавливаете только одно видимое за раз. https://code.google.com/p/android/issues/detail?id=55933

Я не нашел пути вокруг ошибки. Вы не можете установить параметр -Djava в Android Studio или Eclipse (по крайней мере, я мог бы найти). Принудительное использование Java 1.6 должно работать, но это не так. Похоже, что новые highcharts Amazon Fire и телефоны гораздо более чувствительны к этой ошибке, чем другие устройства.

Ходят слухи, что у Java 9 будет такое исправление, как во время выполнения, но с ошибкой, которая существует уже много лет, я сомневаюсь, что она когда-нибудь будет исправлена ​​- особенно учитывая враждебность между Oracle и Google. Любой да, возможно, ошибка действительно глубока в коде Android и должна быть исправлена ​​там. Имея более миллиарда устройств, это не жизнеспособное решение для всех существующих устройств.

  • Как я могу использовать try-with-resources с JDBC?
  • Java-язык с поддержкой Android
  • java.security.cert.CertificateException: сертификаты не соответствуют ограничениям алгоритма
  • Отправка электронной почты с помощью JSP
  • Java 7 Автоматическое управление ресурсами JDBC (приложение try-with-resources)
  • Java 7: путь к файлу
  • Как использовать JDK 7 на Mac OSX?
  • Поддержка сжатия сжатых строк в JSM HotSpot?
  • Какая версия JDK (уровень языка) требуется для Android Studio?
  • Можно ли скомпилировать код Java 8 для работы на Java 7 JVM?
  • Ошибка компилятора: ссылка на вызов неоднозначную
  • Interesting Posts
    Давайте будем гением компьютера.