我用这段代码来测试 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
我知道 finally 会一直运行。我认为这两个函数的结果应该是 4,但实际上 fun1()
是 3,而 fun2()
是 4。为什么?
答案 0 :(得分:3)
这个问题密切相关,虽然它返回的是文字而不是变量:Multiple returns: Which one sets the final return value?
在 fun1
中,返回值通过 catch 块中的 return a
设置。在该行,a
的值被复制到返回值中。稍后更改 a
不会更改返回值。
在 fun2
中,您在 finally
块中有一个显式返回,因此 finally 块中的返回值就是返回的值。
请仔细阅读上述问题中的答案,了解为什么不应该编写那样的代码。
答案 1 :(得分:2)
简单来说,当一个函数返回某些东西时,它会从上次执行的 return 语句返回。在 fun2()
中,第一个返回值是 3
,它被 finally
块的返回值覆盖,即 4
。而在 fun1()
方法中 return 从 3
块设置为 catch
并且由于 func1()
的最后一行从未被执行,因此 3
被返回。