【发布时间】:2020-01-24 21:49:34
【问题描述】:
根据here的回答, 据说如果我们在 try/catch 块中有 return 语句,那么在执行 return 语句之前 finally 块将被执行。
但我看到以下代码的一些意外输出:
输出
在try块中,值为:20
在 finally 块中,值为:40
在main方法中,值为:20
在 try 块返回值之前,'x' 的值在 finally 中设置为 40。但这会将 x 的值作为 20 而不是 40 返回给 main 方法。
有人可以解释一下,它在内部是如何工作的吗?
class ExceptionTest
{
private static int returnValue() {
int x = 10;
try {
x=20;
System.out.println("In try block, value is : " + x);
return x;
}
finally {
x = 40;
System.out.println("In finally block, value is : " + x);
}
}
public static void main (String[] args) throws java.lang.Exception
{
System.out.println("In main method, value is : " + returnValue());
}
}
【问题讨论】:
-
你不会从
finally返回,这就是为什么变量保留在main中分配的值。如果你也从finally返回它,它将是 40 -
我发誓我在一周前看到了 exact 同样的问题。
-
是的here 是问题所在。完全相同的场景。基本上改变
x的值不会改变已经调用的x上的返回值。 -
那句话是真的,它仍然在执行 finally,但是这个
finally块只改变了x的值。return已经使用x来获得它需要的价值!它不会再看x。在 finally 执行完成后,return将“完成”将值从以前带回。如果您在 finally 块中执行了return x然后,则该值将被覆盖,因为return本身已被覆盖。return返回的是 value 而不是 variable,也许这就是你感到困惑的原因。 -
@Ankit 关键是 return 语句返回 表达式 的值,而不是变量。您可以写
return 1;或return someMethod();。这些结果没有存储在变量中(它们只是保存在堆栈中),因此没有机会通过在 finally 中执行某些操作来更新它们的返回值。如果return x;有任何不同,那就太奇怪了。
标签: java exception try-catch-finally