Почему мой простой компаратор повреждается?

Подводя итог вышеприведенному обсуждению: В вашем подходе есть различные проблемы:

  • Аргументом к NSSetUncaughtExceptionHandler является указатель на функцию C. Вы можете передать замыкание в Swift, но только если замыкание не захватывает какой-либо контекст. В вашем случае замыкание не может использовать self. Решение из Как использовать метод экземпляра в качестве обратного вызова для функции, которая принимает только функцию или закрытие литерала ? не может использоваться здесь, потому что NSSetUncaughtExceptionHandler() не имеет параметра «context».

  • Даже если вам удастся сослаться на делегат приложения в обработчике исключений: он может вызываться в любом потоке, поэтому может вызываться неопределенное поведение для вызова любых связанных с пользовательским интерфейсом методов, таких как добавление представлений или меток. [ 1113]

  • NSSetUncaughtExceptionHandler ловит только исключения Objective-C, но не ошибки Swift (из throw) или исключения среды выполнения Swift (такие как «неожиданно найденный ноль»).

  • Даже если исключение поймано, вы не можете «обработать» его таким образом, чтобы программа продолжала впоследствии. Он все равно рухнет.

Вы написали в комментарии

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

blockquote>

Обработчик исключений не подходит для этой цели. Используйте необязательную привязку, дополнительные приведения, охранники и т. Д. Для обработки ответа и избегайте исключений времени выполнения.

17
задан Roman C 20 March 2016 в 08:42
поделиться

6 ответов

Целое число overflow… или более точно, потеря значимости.

Вместо этого сделайте явное сравнение:

private static final Comparator<Thing> reverse = new Comparator<Thing>() {
    public int compare(Thing a, Thing b) {
      int av = a.getValue(), bv = b.getValue();
      return (av == bv) ? 0 : ((av < bv) ? -1 : +1);
    }
};

Используя вычитание прекрасен, если Вы уверены, что различие не "повторится". Например, когда рассматриваемые значения вынуждены быть неотрицательными.

20
ответ дан 30 November 2019 в 10:43
поделиться

При сравнении примитивов Java желательно преобразовать их в их Объектные дубликаты и полагаться на их compareTo() методы.

В этом случае можно сделать:

return Integer.valueOf(a.getValue()).compareTo(b.getValue())

, Когда в сомнении, пользуйтесь хорошо протестированной библиотекой.

5
ответ дан 30 November 2019 в 10:43
поделиться

Вы не можете использовать минус для создания сравнения. Вы переполнитесь, когда абсолютная разность превысит Integer.MAX_VALUE.

Вместо этого используйте этот алгоритм:

int compareInts( int x, int y ) {
  if ( x < y ) return -1;
  if ( x > y ) return 1;
  return 0;
}

мне нравится иметь эту функцию в библиотеке в таких целях.

15
ответ дан 30 November 2019 в 10:43
поделиться

попробуйте

System.out.println(Integer.MAX_Value - Integer.MIN_VALUE);

, Это должно возвратить положительное число как MAX_VALUE> MIN_VALUE, но вместо этого печатает-1

5
ответ дан 30 November 2019 в 10:43
поделиться

Какие числа Вы бросаете там? Если Ваши количества являются достаточно большими, Вы могли бы перенестись через значения МИН/Макса для целых чисел и закончить в путанице.

3
ответ дан 30 November 2019 в 10:43
поделиться

Если величина a очень отрицательна, и значение b очень положительно, что Ваш ответ будет очень неправильным.

IIRC, Международное переполнение тихо повторяется в JVM

- MarkusQ

2
ответ дан 30 November 2019 в 10:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: