目前,我正在实现一个具有以下签名的方法
public static double Newtons_method(double[] payments, double[] days, double guess)
有时,计算会失败。有几种方法可以指示失败。
- 将返回类型更改为
Double
,并返回为null。 - 抛出异常。
- 返回
Double.NaN
并使用Double.isNaN(double)
对其进行测试。
但是,有几个问题。
- 出于性能目的,我不想返回 Object。如果使用
Double
,我需要做很多装箱和拆箱操作。 - 出于性能目的,我不想抛出异常。此外,
try
catch
使代码看起来很乱。不是,在Newtons_method
中,有相当多的常见情况会导致此类算法失败。因此,将它们视为exception
可能不合适
第三种方法如何,返回 Double.NaN
?这是一种好的做法吗?
这是供您引用的源代码。
https://github.com/yccheok/xirr/blob/master/src/org/yccheok/quant/XIRR.java#L56
请注意,尚未实现任何错误检查。因此,err
可能永远不会进一步减少,并且该方法可能会进入无限循环。
最佳答案
通常,在异常情况下使用特殊返回值的做法与 Java 通知调用者异常情况的方式背道而驰。为此,策略 #1 和 #3 是等价的,因为它们都会导致调用者代码如下:
// This could be double or Double
double res = Newtons_method(pmt, guess);
// This could be res==null check or Double.isNaN(res) call
if (!checkResult(res)) {
// Do something else
}
// Do regular processing
这很容易出错,因为不可避免地会有人忘记进行检查,从而导致错误。当嵌套方法调用时,这种情况更容易发生,例如
double res = doStuff(Newtons_method(pmt1, guess), Newtons_method(pmt2, guess));
不正确的结果会使它成为下一级函数调用的参数,从而强制出现参数异常(如果编码人员非常擅长他的参数检查)或难以调试的错误。
您的策略 #2 更好,因为调用者不能简单地“忘记”捕获异常:他们必须捕获并处理它,或者将 throws
添加到他们自己的方法中。
关于java - 从方法返回 Double.NaN 是指示无效 double 值的好习惯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24682270/