Затмение: остановка на NotANumber - PullRequest
2 голосов
/ 02 марта 2011

У меня есть довольно сложный проект, который включает в себя много расчетов.Теперь у меня есть случай, когда результат NaN.Поскольку в расчетах задействовано много классов (а NaN имеют тенденцию распространяться как зомби), происхождение трудно определить.

Теперь мне интересно, кто-нибудь знает, как сделать затмение?выполнение остановки отладчика достигает NaN?Поскольку Java не поддерживает автоматическое создание исключения на NaN, это будет сложно, но, возможно, это было сделано, и мне его не хватает?

Спасибо, Аксель

PS:Я знаю, что мог бы добавить условные точки останова (или операторы if) на Double.isNaN(value), но мне пришлось бы делать это во многих местах.(На самом деле это то, что я собираюсь сделать прямо сейчас.) Просто интересно, есть ли лучшая альтернатива.

Ответы [ 2 ]

2 голосов
/ 02 марта 2011

Теперь мне интересно, кто-нибудь знает, как сделать так, чтобы отладчик затмения останавливал выполнение при попадании в NaN?

Я сомневаюсь в этом.

Так как нормальное поведение Java - не генерировать исключения при появлении NaN, отладчик должен будет вставлять условные точки останова в каждом операторе, который может генерировать единицу. Это будет сложно реализовать и дорого во время выполнения. И ваш вариант использования довольно необычный.

Я думаю, что лучшим подходом может быть добавление утверждений Java в ваш код в нескольких удачно выбранных местах.

0 голосов
/ 02 марта 2011

Не думаю, что есть более простой способ.

Кроме того, полный стандарт IEEE-754 (2008) имеет механизм "обработки исключений" (который не связан с исключениями Java / C # / и т. Д.). Есть 5 исключений:

  1. Недопустимая операция
  2. Деление на ноль
  3. Перелив
  4. Underflow
  5. Неточный результат

Спецификация также имеет стратегию обработки исключений по умолчанию для каждого из этих исключений, а именно:

  1. Заменить NaN
  2. Заменить (подписанную подписью) бесконечность
  3. Заменить (подписанно) бесконечность
  4. Игнорировать
  5. Игнорировать

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

К сожалению, почти все современные языки полностью игнорируют эту часть спецификации и предполагают, что стандартные стратегии обработки исключений "достаточно хороши".

...