6.1 返回值
调用 void 方法时,调用代码通常独占一行。例如,以下是 5.8 节中的 countup 方法:
public static void countup(int n) {if (n == 0) {System.out.println("Blastoff!");} else {countup(n - 1);System.out.println(n);}}
下面的代码演示了如何调用它:
countup(3);System.out.println("Have a nice day.");
另一方面,调用值方法时,必须对其返回值做些什么。我们通常将其赋给变量或用于表达式中,如下所示:
double error = Math.abs(expected - actual);double height = radius * Math.sin(angle);
与 void 方法相比,值方法有两个不同之处:
声明了返回值的类型,即返回类型(return type);
至少使用了一条
return语句来提供返回值(return value)。
下面是一个示例:calculateArea 接受一个 double 参数,并返回以该参数值为半径的圆的面积:
public static double calculateArea(double radius) {double result = Math.PI * radius * radius;return result;}
与本书前面一样,这个方法也是公有的、静态的,但在以前为 void 的地方使用了 double,这意味着该方法的返回值为 double 值。
最后一行是一种新型的 return 语句,其中包含一个返回值。这条语句的意思是,立即从这个方法返回,并将接下来的表达式用作返回值。这个表达式的复杂程度没有限制,因此我们可以更简洁地编写这个方法:
public static double calculateArea(double radius) {return Math.PI * radius * radius;}
然而,使用 result 这样的临时变量(temporary variable)通常可以简化调试工作,在用交互式调试器(参见 A.6 节)以步进方式执行代码时尤其如此。
return 语句中的表达式类型必须与方法的返回类型一致。将返回类型声明为 double 时,其实就是承诺这个方法最终将生成一个 double 值;如果使用的 return 语句不包含表达式或包含的表达式的类型不正确,那么编译器将显示错误消息。
有时候,使用多条 return 语句很有用,例如,在条件语句的每个分支中使用一条:
public static double absoluteValue(double x) {if (x < 0) {return -x;} else {return x;}}
由于这些 return 语句位于条件语句中,因此只会执行其中一条。只要执行了其中任何一条 return 语句,这个方法就会立即结束,不再执行其他的语句。
位于 return 语句后,且与之同属一个代码块的代码以及其他地方根本不会执行的代码被称为无用代码(dead code)。如果程序包含无用代码,编译器将显示错误消息——unreachable statement(不可达语句)。例如,下面的方法就包含无用代码:
public static double absoluteValue(double x) {if (x < 0) {return -x;} else {return x;}System.out.println("This line is dead.");}
将 return 语句放在条件语句中时,必须确保程序中的每条可能的执行路径都包含一条 return 语句。如果情况并非如此,编译器将指出这一点。例如,下面的方法就不完整:
public static double absoluteValue(double x) {if (x < 0) {return -x;} else if (x > 0) {return x;}// 语法错误}
如果 x 为 0,那么将不满足任何上述条件,这会导致方法的执行路径中没有 return 语句。在这种情况下,编译器显示的错误消息可能类似于这样:missing return statement(缺少 return 语句)。这条错误消息令人迷惑,因为已经有两条 return 语句了。希望你以后遇到这种情况时知道这是怎么回事。
