Java математика - тестирование для NaN - PullRequest
5 голосов
/ 26 января 2010

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

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

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

Ответы [ 5 ]

4 голосов
/ 26 января 2010

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

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

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

4 голосов
/ 26 января 2010

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

2 голосов
/ 26 января 2010

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

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

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

2 голосов
/ 26 января 2010

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

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

2 голосов
/ 26 января 2010

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

...