在Java中,如何表示整数类型的NaN?

22

我有一个返回值为long类型的方法,但有时无法计算出有效结果。 Double有一个NaN常量,但在long中无法表示。

我能想到两种解决方案:

  • 抛出异常
  • 更改方法签名以返回double,检查是否为NaN,并在一切正常时转换为long

哪种方案更好/更符合"Javanic"? 是否还有其他方法/我漏掉了一些明显的方法?


5
您意识到在“double”和“long”之间进行转换会有信息损失吗? - Tom Hawtin - tackline
10个回答

8
你可以将返回类型设为 Long (即封装版本的 long) 并返回 null

4
我认为这比直接抛出异常更糟,特别是考虑到人们可能会将返回值分配给“long”,这将导致难以处理的NPE错误。 - Voo
2
NullPointerException并不可恶。如果方法返回值是Long,并且文档说明空值是有效的返回值,那么检查空值就由调用者来负责。你认为NPE可恶意味着程序员不好或懒惰,这两个理由都不足以不返回空值。 - Steve Kuo
这里还有一个与自动装箱相关的问题。原始类型始终比它们的对象包装器对应物更快、更高效。 - ahrooran

7
只需使用包装类(例如java.lang.Integerjava.lang.Long),允许null值。

6
任何返回NAN的应用程序都不符合设计要求,原因是NAN表示发生了异常情况,因此你应该抛出异常,如IllegalStateException或EntityNotFoundException,这样调用者就知道发生了什么而不是NAN。
如果你的应用程序接受大于0(零)的任何值作为有效值,则可以返回负数而不是NAN,以指示已达到异常路径,如果你不想抛出异常,尽管我认为在这种情况下抛出异常是最好的。

5

我不建议使用null来表示NaN值。如果你跳过了空检查,它很容易导致后面出现NullPointerException。(这种NullPointerException非常难以发现,因为有隐式拆箱。你可能看不到哪里会是null。)否则,使用NaN值进行操作是有意义的:NaN+x=NaN,NaN*x=NaN。

在我看来,抛出异常、使用double(顺便支持NaN),或者使用自己的类都是更好的选择。


3

我使用MIN_VALUE来表示longint类型的NaN。这需要进行额外的检查,在某些情况下非常有用。


2

就像大多数这类问题一样,没有对与错,答案是“取决于情况”。

重要的是考虑为什么无法计算出有效结果。如果是因为输入无效,则应该抛出IllegalArgumentException异常。

如果是由于其他一些在正常情况下不应发生的原因,则可能需要使用其他异常。

您可以考虑使用某个长整型值来表示错误。

否则,Pollex先生使用Long和null返回的解决方案也值得考虑。答案还取决于对绝大多数调用者而言哪种方式更方便。


1

我会投票支持抛出异常

或者像其他人建议的那样,返回空值


1

我的想法是抛出异常,因为这表示错误--结果无法正确计算。然而,这只是一种观点。

你返回什么取决于你的具体需求以及哪些值是有效的。例如,如果有效数字只有1及以上,您可以使用0作为标志。或者您可以使用负数作为标志。

或者,当我输入这些内容时,我看到已发布答案,建议返回Long并将其设置为空。然后它可以自动装箱。这也是完全正确的答案。

如果您需要从方法中返回更多数据,则甚至可以定义自定义类,该类可以包含长整数和其他包含计算或结果数据的属性。

但是,再次强调,我的个人偏好是异常。


0

这很容易展示NaN值,只需定义一个双精度类型的变量,然后像下面这样赋值:

double identifier = java.lang.Double.NaN;

我遇到了同样的情况,所以我使用了它并且它起作用了。 如果没有直接的路径,就必须想办法绕过去。


3
这个问题明确涉及整数类型。 - Micah Smith
您可以与整数使用相同的操作。 - Pervaiz Ahmed

0
嗨,感谢你的帖子,我遇到了类似的问题。我阅读了关于Integer.parseInt的文档,并发现如果值不是整数,它会抛出一个NumberFormatException异常。所以我将我的代码放在了try catch的格式中,结果运行得相当不错!
try {
                Integer gotoAddress = Integer.parseInt(gotoAddressTextField.getText());
                table.setRowSelectionInterval(gotoAddress, gotoAddress);
                table.scrollRectToVisible(table.getCellRect(gotoAddress, 1, true));


            } catch (NumberFormatException nfe) {
                JOptionPane.showMessageDialog(null, "You must enter a valid integer number!!");

            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接