我遇到了这个问题,我无法理解它所输出的输出的原因。
该计划是:
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块返回值
现在,我调试了它,s
块中return s
语句的try
值为return value from try block
,return value from catch block
后returned from finally block
laravel-echo-server
仍然是输出:
从try块返回值
任何人都能解释一下这种行为吗?
答案 0 :(得分:1)
首先,让我们了解Java如何处理方法调用。 每个线程都有单独的堆栈内存。当我们调用任何方法时,Java会在堆栈顶部插入一条记录。该记录包含一些细节,如参数&对象等。
这里有一个有趣的领域:返回值。只要遇到return语句,就会更新该字段。现在观察代码。
在try
块中,返回值字段设置为try
块的返回值。现在根据执行顺序执行finally
块。现在finally
块修改了字符串引用s
。它没有修改先前由try块确定的return value
字段。最后方法调用完成& Java内部弹出记录&返回返回值字段。所以它从try块返回返回值。
如果finally
块在修改后返回字符串,则返回值字段将再次更新,并且将返回更新后的字符串。
答案 1 :(得分:-1)
如果您在代码中包含return statement
,请在try block
中避免使用finally
,而不要在方法的最后使用它。此外,您无法修改finally块中返回变量的值。
见https://stackoverflow.com/a/3643047/6286156
答案 2 :(得分:-2)
最后
最后在try / catch语句中用于执行代码“always”
lock.lock();
try {
//do stuff
} catch (SomeException se) {
//handle se
} finally {
lock.unlock(); //always executed, even if Exception or Error or se
}
Java 7有一个新的try with resource语句,您可以使用它来自动关闭显式或隐式实现java.io.Closeable或java.lang.AutoCloseable的资源