我用下面的代码来测试try catch finally:
public class My{
public static void main(String[] args) {
System.out.println(fun1());
System.out.println(fun2());
}
public static int fun1() {
int a = 1;
try {
System.out.println(a / 0);
a = 2;
} catch (ArithmeticException e) {
a = 3;
return a;
} finally {
a = 4;
}
return a;
}
public static int fun2() {
int a = 1;
try {
System.out.println(a / 0);
a = 2;
} catch (ArithmeticException e) {
a = 3;
return a;
} finally {
a = 4;
return a;
}
}
}
输出:
3
4
我知道最后总会跑。我认为这两个函数的结果应该是4,但实际上fun1()
是3,fun2()
是4。为什么?
这个问题与此密切相关,尽管它返回的是文字而不是变量:多个返回:哪个设置最终返回值?
在fun1
中,返回值通过捕获块中的return a
设置。在这一行,a
的值被复制到返回值中。后续修改a
不会改变返回值
在fun2
中,你在finally
块中有一个显式的返回,所以在finally块中的返回值是返回的。
请仔细阅读上面问题的答案,了解为什么不应该这样写代码。
另一个相关的问题是:从Java中的finally块返回
简单地说,当一个函数返回某个东西时,它从最后执行的返回语句返回。在fun2()
中,第一个返回值是3
,它被finally
块的返回值即4
覆盖。而在fun1()
中,方法返回从catch
块设置为3
,并且由于func1()
的最后一行从未执行,因此返回3
。