String返回finally和try块

时间:2017-06-04 06:05:32

标签: 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";
        return s;
    }
    finally
    {
        s = s + "return value from finally block";
    }

}

输出结果为:

  

从try块返回值

现在,我调试了它,s块中return s语句的try值为return value from try blockreturn value from catch blockreturned from finally block laravel-echo-server

仍然是输出:

  

从try块返回值

任何人都能解释一下这种行为吗?

3 个答案:

答案 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的资源