Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top