对于我正在进行的计算,我制定了一种方法来计算两个数字中最低的一个:
public static double min(double one, double two){
if (one < two) return one; //Return one if it is less than two
if (two < one) return two; //Return two if it is less than one
if (one == two) return two; //Return two, because it's the same.
}
然而,Eclipse告诉我"这个方法必须返回类型double"。
我对此感到困惑,因为方法必须返回doubles!一个数字可以大于、小于或等于另一个数字。因此,当不返回双精度时,没有任何实例。
Eclipse为什么抱怨这件事?
除了已经给出的答案之外,如果其中一个doubles未定义(Double.NaN
),则所有这些检查都可能失败。这是因为涉及NaN值的比较总是返回false,而与涉及的其他值无关。
因此,编译器说该方法需要有一个默认的返回值是正确的。这可以通过这个测试用例来显示,它将打印"默认":
public static void main(String[] args) {
double one = 1;
double two = Double.NaN;
System.out.println(min(one, two));
}
static String min(double one, double two) {
if (one < two) return "one";
if (one > two) return "two";
if (one == two) return "two";
return "defaulted";
}
编译器检测到,如果不满足所有三个if
条件,则该方法将不返回任何值。在这种情况下,这在逻辑上可能没有意义——因为必须满足这三个条件中的任何一个,但编译器在语义上并不真正关心这一点。
假设您正在调试程序,当调用该方法时,one
大于two
。然后第一个if
条件不满足,并且执行进入下一个条件,该条件应当为真。但是,如果在断点暂停执行时,您使用调试器将one
的值更改为小于two
,则第二个if
条件也将不满足。最终,这种情况导致不满足任何条件。
当在末尾添加return
语句时,无论在执行过程中发生什么情况,该方法都保证返回一个值。
在任何执行路径中都必须有一个返回语句:
public static double min(double one, double two){
if (one < two)
return one;
else if (two < one)
return two;
else
return two;
}
即使if语句涵盖了one
和two
之间的所有可能关系,编译器也不知道这一点。
为了让编译器理解这一点,您必须这样做:
if (one <= two)
return one;
else
return two;
然而,我敦促您看看Math.min(doube x, double y)
,它正是您试图重新实现的。