使用try catch finally返回值的顺序



我用下面的代码来测试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

相关内容

  • 没有找到相关文章

最新更新