【问题标题】:String returns in finally and try block [duplicate]字符串最终返回并尝试阻止[重复]
【发布时间】:2017-11-05 04:21:41
【问题描述】:

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

程序是:

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 块中return s 语句中s 的值在returned from finally block 之后是return value from try blockreturn value from catch block

输出仍然是:

try 块的返回值

谁能解释一下这种行为?

【问题讨论】:

标签: java try-catch-finally


【解决方案1】:

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

这里有一个有趣的领域:返回值。每当遇到 return 语句时,都会更新该字段。现在观察代码。

try 块中,返回值字段设置为来自try 块的返回值。现在按照执行顺序执行finally 块。现在finally 块修改了字符串引用s。它没有修改之前由 try 块解决的 return value 字段。最后​方法调用完成&Java内部弹出记录&返回返回值字段。所以它会从 try 块返回返回值。

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

【讨论】:

    【解决方案2】:

    如果您在代码中包含finally,请避免在try block 中使用return statement,而是在方法末尾使用它。此外,您不能在 finally 块中修改返回变量的值。 见https://stackoverflow.com/a/3643047/6286156

    【讨论】:

      【解决方案3】:

      终于

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

      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 resources 语句,可用于自动关闭显式或隐式实现 java.io.Closeable 或 java.lang.AutoCloseable 的资源

      【讨论】:

        猜你喜欢
        • 2013-11-17
        • 1970-01-01
        • 2013-08-10
        • 1970-01-01
        • 2016-01-10
        • 2014-01-09
        • 1970-01-01
        • 2011-10-06
        • 1970-01-01
        相关资源
        最近更新 更多