java - 从方法返回 Double.NaN 是指示无效 double 值的好习惯

标签 java

目前,我正在实现一个具有以下签名的方法

public static double Newtons_method(double[] payments, double[] days, double guess)

有时,计算会失败。有几种方法可以指示失败。

  1. 将返回类型更改为Double,并返回为null。
  2. 抛出异常。
  3. 返回 Double.NaN 并使用 Double.isNaN(double) 对其进行测试。

但是,有几个问题。

  1. 出于性能目的,我不想返回 Object。如果使用 Double,我需要做很多装箱和拆箱操作。
  2. 出于性能目的,我不想抛出异常。此外,try catch 使代码看起来很乱。不是,在 Newtons_method 中,有相当多的常见情况会导致此类算法失败。因此,将它们视为 exception
  3. 可能不合适

第三种方法如何,返回 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/

相关文章:

java - 在 C# 中解密 AES 加密字符串

java - boolean 数组的 getter[][]

java - 是什么导致了 java.lang.ArrayIndexOutOfBoundsException 以及如何防止它?

java - 十六进制到 ASCII 显示不同的结果以纠正 PHP 实现

java - OpenGL旋转问题

java - 我在哪里可以找到 Java/Python 中良好的 ajax 支持?

java - java编译器是否理解if语句中给出的条件?

Java SimpleDateFormat 在 Date 对象中返回错误值

c# - 在 C# 或 Java 中对 MruList 进行高效建模

java - 如何确定给定字符串是否为 .xml 文件