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
}