最后用try catch return值的顺序
The order of return value with 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。为什么?
这个问题密切相关,虽然它return是文字但不是变量:Multiple returns: Which one sets the final return value?
在 fun1
中,return 值是通过 catch 块中的 return a
设置的。在该行,a
的值被复制到 return 值中。稍后更改 a
不会更改 return 值。
在 fun2
中,您在 finally
块中有一个明确的 return,因此 finally 块中的 return 值就是 returned .
请仔细阅读上述问题的答案,了解为什么您不应该这样编写代码。
另一个相关问题是这个:Returning from a finally block in Java
简单来说,当一个函数 return 是它 return 来自最后执行的 return 语句的东西。在 fun2()
中,第一个 return 值是 3
,它被 finally
块的 return 值覆盖,即 4
。而在 fun1()
方法中,return 从 catch
块设置为 3
,并且由于 func1()
的最后一行永远不会执行,因此 3
是 returned.
我用这段代码来测试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。为什么?
这个问题密切相关,虽然它return是文字但不是变量:Multiple returns: Which one sets the final return value?
在 fun1
中,return 值是通过 catch 块中的 return a
设置的。在该行,a
的值被复制到 return 值中。稍后更改 a
不会更改 return 值。
在 fun2
中,您在 finally
块中有一个明确的 return,因此 finally 块中的 return 值就是 returned .
请仔细阅读上述问题的答案,了解为什么您不应该这样编写代码。
另一个相关问题是这个:Returning from a finally block in Java
简单来说,当一个函数 return 是它 return 来自最后执行的 return 语句的东西。在 fun2()
中,第一个 return 值是 3
,它被 finally
块的 return 值覆盖,即 4
。而在 fun1()
方法中,return 从 catch
块设置为 3
,并且由于 func1()
的最后一行永远不会执行,因此 3
是 returned.