我有一个返回值为long
类型的方法,但有时无法计算出有效结果。 Double
有一个NaN
常量,但在long
中无法表示。
我能想到两种解决方案:
- 抛出异常
- 更改方法签名以返回
double
,检查是否为NaN,并在一切正常时转换为long
。
哪种方案更好/更符合"Javanic"? 是否还有其他方法/我漏掉了一些明显的方法?
Long
(即封装版本的 long
) 并返回 null
。Long
,并且文档说明空值是有效的返回值,那么检查空值就由调用者来负责。你认为NPE可恶意味着程序员不好或懒惰,这两个理由都不足以不返回空值。 - Steve Kuojava.lang.Integer
,java.lang.Long
),允许null
值。我不建议使用null来表示NaN值。如果你跳过了空检查,它很容易导致后面出现NullPointerException。(这种NullPointerException非常难以发现,因为有隐式拆箱。你可能看不到哪里会是null。)否则,使用NaN值进行操作是有意义的:NaN+x=NaN,NaN*x=NaN。
在我看来,抛出异常、使用double(顺便支持NaN),或者使用自己的类都是更好的选择。
我使用MIN_VALUE来表示long
和int
类型的NaN。这需要进行额外的检查,在某些情况下非常有用。
就像大多数这类问题一样,没有对与错,答案是“取决于情况”。
重要的是考虑为什么无法计算出有效结果。如果是因为输入无效,则应该抛出IllegalArgumentException异常。
如果是由于其他一些在正常情况下不应发生的原因,则可能需要使用其他异常。
您可以考虑使用某个长整型值来表示错误。
否则,Pollex先生使用Long和null返回的解决方案也值得考虑。答案还取决于对绝大多数调用者而言哪种方式更方便。
我会投票支持抛出异常
或者像其他人建议的那样,返回空值
我的想法是抛出异常,因为这表示错误--结果无法正确计算。然而,这只是一种观点。
你返回什么取决于你的具体需求以及哪些值是有效的。例如,如果有效数字只有1及以上,您可以使用0作为标志。或者您可以使用负数作为标志。
或者,当我输入这些内容时,我看到已发布答案,建议返回Long并将其设置为空。然后它可以自动装箱。这也是完全正确的答案。
如果您需要从方法中返回更多数据,则甚至可以定义自定义类,该类可以包含长整数和其他包含计算或结果数据的属性。
但是,再次强调,我的个人偏好是异常。
这很容易展示NaN
值,只需定义一个双精度类型的变量,然后像下面这样赋值:
double identifier = java.lang.Double.NaN;
我遇到了同样的情况,所以我使用了它并且它起作用了。 如果没有直接的路径,就必须想办法绕过去。
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!!");
}