2014-04-04 274 views
-2

下面这段代码的输出是“Test Passed”;有人可以向我解释为什么?将finally赋值给变量

public class Test { 
    public static void main(String args[]) { 
     System.out.println(new Test().print()); 
    } 

    protected StringBuilder print() { 
     StringBuilder builder = new StringBuilder(); 
     try { 
      builder.append("Test "); 
      return builder.append("Passed!!!"); 
     } finally { 
     builder = null; 
    } 
} 
+0

请使用代码格式。 –

回答

0

答案很简单。

Finally块将肯定被执行,因为不必返回从它的任何值,则try块返回值将被传递到原主叫方

try { 
    builder.append("Test "); 
    return builder.append("Passed!!!"); 
} finally { 
    builder = null; 
} 

因此,你得到“测试通过! !”

代码更改为

StringBuilder builder = new StringBuilder(); 
try { 
    builder.append("Test "); 
    return builder.append("Passed!!!"); 
} finally { 
    return null; 
} 

肯定会打印出 “空” 如你预期

6

基本上,Java那样如下:

StringBuilder valueToReturn = builder.append("Passed!!!"); 
executeFinallyBlock(); 
return valueToReturn; 

不管你在做内部在finally块中,Java保留了对返回值的引用,并返回该引用。所以它变成:

StringBuilder valueToReturn = builder.append("Passed!!!"); 
builder = null; 
return valueToReturn;