这个问题在这里已有答案:
我有以下问题:我知道以下代码的输出
try {
int a = 0;
System.out.println("The method will return " + a);
return a;
} catch (Exception e) {
;
}
finally {
System.out.println("Finally executed");
}
将会
The method will return 0
Finally executed
我的问题是:以下代码返回什么?
int a = 0;
try {
System.out.println("The method will return " + a);
return a;
} catch (Exception e) {
;
}
finally {
System.out.println("Finally executed");
a = 1;
return a;
}
换句话说,最终是在调用该方法的代码之前还是之后执行的?
finally
块在return语句之后执行。该方法将返回0,因为到那时已经读取了a
的值并且更改它将不再更改返回值。
要更改返回值,可以在return
块中添加finally
语句。这不是真的值得推荐,因为现在执行了两个return语句,这对大多数人来说都是不直观的。
...
finally {
System.out.println("Finally executed");
return 1;
}
该方法的输出将与以前一样。在返回之后进行的a
的赋值将没有明显的效果,即调用者将接收0
作为返回值。由于try
块没有抛出,最后的return
实际上无法到达。
finally
块在计算返回值之后执行,但在接收器返回值之前执行。
如果你返回一个可变对象而不是一个原语,答案就会改变,但是你在finally
块中做的突变(如果有的话)对于你的函数的调用者是可见的:
static int[] test() {
int[] a = new int[1];
try {
System.out.println("The method will return [" + a[0] + "]");
return a;
} catch (Exception e) {
;
} finally {
System.out.println("Finally executed");
a[0] = 1;
}
return a;
}
在上面,将返回int[] {0}
,但来电者将获得int[] {1}
。
注意:如果你认为这是邪恶的,你可能是对的。
在返回控制到调用者之前执行finally块。
输出将是
The method will return 0
Finally executed
调用者将值取为0
如果你把调试器放在return语句上。您可以轻松找出更改a值的原因对返回值没有任何影响的原因
如果没有异常则返回0,或者返回finally语句(1)之后的内容。请注意,因为如果catch抛出异常(事实并非如此),它将不会返回任何值,但finally语句将运行。