我有以下问题: 我知道以下代码的输出
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;
}
换句话说,最终是在调用该方法的代码之前还是之后执行的?
答案 0 :(得分:3)
{return}语句后执行finally
块。该方法将返回0,因为到那时已读取a
的值并且更改它将不再更改返回值。
要更改返回值,您可以在return
块中添加finally
语句。这不是真的值得推荐,因为现在执行了两个返回语句,这对大多数人来说都是不直观的。
...
finally {
System.out.println("Finally executed");
return 1;
}
答案 1 :(得分:2)
该方法的输出将与以前一样。返回后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}
。
注意:如果您认为这是邪恶的,那么您可能是对的。
答案 2 :(得分:0)
如果没有异常则返回0,或者返回finally语句(1)之后的内容。请注意,因为如果catch抛出异常(事实并非如此),它将不会返回任何值,但finally语句将会运行。
答案 3 :(得分:0)
在返回控制权之前执行finally块。
答案 4 :(得分:0)
输出
The method will return 0
Finally executed
调用者将获得0的值
如果你把调试器放在return语句上。您可以轻松找出更改a的值对返回值没有任何影响的原因