我正在尝试在方法开始时测试是否为空输入。如果找到的话,我希望返回null,即使该方法通常返回双精度值。
我需要保持方法类型为double
public double computeMean (double[] grades) {
if (grades == null) {
return null;
无法从null转换为double
答案 0 :(得分:2)
您应该使用
如果希望能够返回
Double
包装类(注意大写的“ d”)
double
,请不要将null
基本类型作为返回类型。
答案 1 :(得分:1)
null
是只能用于对象的值。 double
是原始的,它不使用对象系统。因此,如果您将null
指定为返回类型,则无法返回double
。
那么,您有什么选择?
Double
包装器您可以改为使用Double
,这是double
的包装类,它使用对象系统。
由于Java会在需要时在double
和Double
之间进行自动转换(自动装箱),因此使用起来非常方便。
请注意,使用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