2017-06-04 30 views
5

我遇到了这个问题,我无法理解它给出的输出的原因。字符串最终返回并尝试块

的程序是:

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块

返回值现在,我调试它和sreturn s声明价值try区块为return value from try block,return value from catch block之后returned from finally block

不过输出结果是:从try块

返回值可以在任何一个请解释这种现象?

+0

看到这个https:// stackoverflow。我想你会在这里找到更多的解释[Try-catch-finally-return澄清 - 堆栈溢出](https://stackoverflow.com/questions)/ /问题/ 65035 /不终于总是执行在java中 – mmuzahid

+1

/15225819/try-catch-finally-return-clarification) –

+0

答案来自oracle文档: “finally块总是在try块退出时执行,这确保finally块即使发生意外异常也会执行。 “ 检查此参考:https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html – Oghli

回答

1

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

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

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

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

-2

终于

终于在一个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中有一个新的尝试与资源声明,你可以用它来自动关闭资源,明确或隐式实现java.io.Closeable或java.lang.AutoCloseable

相关问题