Как выразить NaN для целых типов в Java?

У меня есть метод, возвращающий long, и бывают случаи, когда действительный результат не может быть вычислен. Double имеет константу NaN, которая не выражается в long.

Я могу думать о двух решениях:

  • выполнить исключение
  • измените подпись метода для возврата Double, проверьте для NaN и преобразуйте в long, если все в порядке.

Является ли предпочтительным/более "яваным"? Есть ли другие способы/Я пропустил что-то очевидное?

Ответы

Ответ 1

Просто используйте класс оболочки (т.е. java.lang.Integer, java.lang.Long), что позволяет использовать значения null.

Ответ 2

Вы можете сделать возвращаемый тип Long (вставка в коробке Long) и вернуть null.

Ответ 3

Любое приложение, возвращающее NAN, не вписывается в дизайн, но NAN означает, что что-то произошло, что является исключительным условием, поэтому вы должны бросать исключение, например IllegalStateException или EntityNotFoundException, чтобы вызывающий абонент знал, что произошло вместо NAN.

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

Ответ 4

Как и в большинстве вопросов этого типа, нет правильного и неправильного ответа, и ответ "зависит".

Важно учитывать, почему действительный результат не может быть вычислен. Если это из-за недопустимого ввода, вы должны выбросить исключение IllegalArgumentException.

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

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

В противном случае стоит упомянуть решение г-на Поллека использования длинного и нулевого возврата. Ответ зависит от того, что было бы удобно для большинства абонентов.

Ответ 5

Я бы не советовал использовать null для представления значения NaN. Это может легко вызвать NullPointerException позже, если вы пропустите нулевую проверку. (И этот вид NullPointerException может быть очень трудно обнаружить из-за неявного unboxing. Вы можете не видеть непосредственно, что может быть нулевым.) В противном случае работа с значениями NaN имеет смысл: NaN + x = NaN, NaN * x = NaN.

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

Ответ 6

Я использую MIN_VALUE для обозначения типов NaN для long и int. Это требует дополнительной проверки и может быть полезно в некоторых случаях.

Ответ 7

Я бы отдал свой голос за исключение исключения

или, как предложили другие, верните нулевое значение

Ответ 8

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

То, что вы возвращаете, действительно зависит от ваших конкретных потребностей и значений. Например, если действительные числа всего 1 и выше, вы можете использовать 0 в качестве своего флага. Или вы можете использовать отрицательное число в качестве своего флага.

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

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

Но опять же, мое личное предпочтение было бы исключением.

Ответ 9

Это легко показать значение NaN. Просто определите двойной тип var и затем присвойте ему значение, например

double identifier = java.lang.Double.NaN;

У меня была такая же ситуация, поэтому я использовал ее, и она сработала. Нужно найти способ, если прямой путь не определен.