Математика Java - тестирующий на NaN

Я хотел бы иметь некоторый сбой всего проекта быстрый механизм (возможно, a RuntimeException) для любого кода, который вызывает присвоение NaN.

В моем проекте NaN никогда не допустимое значение.

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

5
задан Pool 26 January 2010 в 15:52
поделиться

5 ответов

Да, вы можете использовать AspectJ (аспектно-ориентированное программирование) для выдачи ошибки всякий раз, когда установлено значение NaN.

По сути, вы хотите перехватывать всякий раз, когда установлено значение, и выполнять некоторую другую функцию.

Мы делали похожие вещи в нашей кодовой базе ... но я не могу оказать вам особой помощи, кроме этого.

4
ответ дан 18 December 2019 в 13:14
поделиться

Нет - потому что NaN является действительным значением, использование которого не вызовет никаких исключений. Без вездесущих механизмов мониторинга, которые можно было бы использовать, вам пришлось бы явно тестировать в точках, где оно может быть назначено или возвращено из метода.

4
ответ дан 18 December 2019 в 13:14
поделиться

Технически, можно было бы создать агента для этого методом Инструментаринг Код, имеющий вопрос для введения Assert или , если тесты автоматически. Это будет включать немного осмотра и преобразования байттекода (например, использование ASM ). На мой взгляд, это потребовало бы необычных обстоятельств, чтобы гарантировать это. Вы должны быть осторожны, чтобы не инструментировать какие-либо классы, которые полагаются на возможность обрабатывать NAN внутри.

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

2
ответ дан 18 December 2019 в 13:14
поделиться

Просто другой подход - вы можете интегрировать в процесс сборки такие устройства проверки кода, как PMD и создать правило, сообщающее о каждом назначении Double.NaN.

Это будет не идеально, потому что не может поймать NaN, который вы получаете извне (база данных, соединения) или который кто-то создает с помощью манипуляций с битами, но, по крайней мере, вы можете быть уверены, что Double.NaN не может быть присвоен переменной или использован в качестве параметра метода или внутри вычисления.

Определение правил может быть сложным - но, по крайней мере, это другой подход. Самым простым правилом могло бы быть запрещение Double.NaN вообще.

2
ответ дан 18 December 2019 в 13:14
поделиться

Если вы готовы пожертвовать производительностью приложения, вы можете создать обертку для двойного (или другого численного объекта, который вы хотите использовать) и бросать исключение, когда NAN набор.

2
ответ дан 18 December 2019 в 13:14
поделиться
Другие вопросы по тегам:

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