Java 字符串返回finally并重试块

Java 字符串返回finally并重试块,java,try-catch-finally,Java,Try Catch Finally,我遇到了这个问题,我无法理解它输出的原因 该计划是: public static String method(){ String s = new String(); try { s = "return value from try block"; return s; } catch (Exception e) { s = s + "return value from catch block";

我遇到了这个问题,我无法理解它输出的原因

该计划是:

public static String method(){

    String s = new String();
    try
    {
        s = "return value from try block";
        return s;
    }
    catch (Exception e)
    {
        s = s + "return value from catch block";
        return s;
    }
    finally
    {
        s = s + "return value from finally block";
    }

}
输出为:

从try块返回值

现在,我调试了它,
try
block中
returns s
语句处的
s
值是
returnvalue from try block
return value from catch block
,之后是
return value from finally block

输出仍然是:

从try块返回值


有人能解释一下这种行为吗?

首先,让我们了解Java是如何处理方法调用的。 每个线程都有单独的堆栈内存。当我们调用任何方法时,Java会在堆栈顶部插入一条记录。该记录包含一些细节,如参数和对象等

这里有一个有趣的字段:返回值。无论何时​ 遇到return语句时,将更新该字段。现在请遵守守则

try
块中,返回值字段设置为
try
块的返回值。现在按照执行顺序执行
最后
块。现在,
最后
块修改字符串引用
s
。它没有修改以前由try块结算的
返回值
字段。最后​ 方法调用完成&Java在内部弹出记录并返回返回值字段。因此它从try块返回返回值

如果修改后
finally
块返回字符串,则返回值字段将再次更新,并返回更新后的字符串。

finally

finally在try/catch语句中用于执行代码“始终”


Java 7有一个新的try with resources语句,您可以使用它来自动关闭显式或隐式实现Java.io.Closeable或Java.lang.AutoCloseable的资源在
try block
中避免
return语句,如果您在代码中包含
finally
,请在方法末尾使用它。此外,您不能在finally块中修改返回变量的值。
请参见

查看此示例,我想您会在此处找到更多说明。答案来自oracle文档:“当try块退出时,始终会执行finally块。这确保即使发生意外异常,也会执行finally块。”请检查此参考:
lock.lock();
try {
  //do stuff
} catch (SomeException se) {
  //handle se
} finally {
  lock.unlock(); //always executed, even if Exception or Error or se
}