在返回双精度java的方法中返回null

时间:2019-10-18 14:48:27

标签: java null

我正在尝试在方法开始时测试是否为空输入。如果找到的话,我希望返回null,即使该方法通常返回双精度值。

我需要保持方法类型为double

public double computeMean (double[] grades) {
        if (grades == null) {
            return null;
  

无法从null转换为double

2 个答案:

答案 0 :(得分:2)

您应该使用

  

Double包装类(注意大写的“ d”)

如果希望能够返回double,请

不要将null基本类型作为返回类型。

答案 1 :(得分:1)

说明

null是只能用于对象的值。 double是原始的,它不使用对象系统。因此,如果您将null指定为返回类型,则无法返回double

那么,您有什么选择?


Double包装器

您可以改为使用Double,这是double的包装类,它使用对象系统。

由于Java会在需要时在doubleDouble之间进行自动转换(自动装箱),因此使用起来非常方便。

请注意,使用Double会给小的double带来相当大的开销,而且人们通常会在将null转换为{时忘记检查Double {1}}。即

double

相反,用户必须记住检查结果值:

// foo() returns Double
double value = foo(); // Bad code, it could be null!

Double result = foo(); if (result == null) { ... } else { double value = result; ... }

现代且可能更好的替代方法是使用OptionalDouble(为此您至少需要Java 8)。

它被设计为在有时自然无法返回结果的方法中使用。例如,如果数组传入 empty 。这种情况是完全可以的,不要认为是错误。

这也解决了用户忘记检查结果的问题。 Optional迫使他们进行检查,否则他们将无法获得基础价值。

为了避免Optional(再次是包装器类)的性能开销,还有Optional<Double>在内部使用OptionalDouble(原始)。这是代码:

double

以及用法:

public OptionalDouble computeMean(double[] grades) {
    if (grades == null) {
        return OptionalDouble.empty();
    }
    ...
    return OptionalDouble.of(result);
}

例如,用户从那里有几个选项(请参见documentation

OptionalDouble result = computeMean(...);

异常

最后一个选择是实际上只是抛出一个异常。每当用户做一些不想要的事情并且违背您认为正确的用法(在方法文档中指出)时,您都应该考虑这一点。

我实际上会说,在您的特定情况下,就是这种情况。无法在double value = result.orElse(10.4); // or double value = result.orElseThrow(); // or if (!result.isPresent()) { ... } else { double value = result.getAsDouble(); } 上计算mean。这与传递一个空数组不同,在该数组中,我会输入一个空null。对于Optional数组,我将抛出一个异常,以指示用法不正确。

null是这种情况的一个很好的例外,下面是代码:

IllegalArgumentException

该用例的另一个惯常异常是抛出public double computeMean(double[] grades) { if (grades == null) { throw IllegalArgumentException("Grades must not be null!"); } ... } 。甚至有一种紧凑的帮助程序方法可以在一行中完成所有这些操作:

NullPointerException

结果

将所有这些放在一起,我将进行以下两个更改:

  • 如果public double computeMean(double[] grades) { Objects.requireNonNull(grades); // Yes, thats it ... } NullPointerException,则使用grades抛出null
  • 如果Objects#requireNonNull为空,请返回空的OptionalDouble
grades
相关问题