在finally块中为null赋值null

以下代码的输出是“Test Passed”; 谁能解释一下为什么?

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; } } 

基本上,Java的作用如下:

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

无论你在finally块中做什么,Java都会保留对要返回的值的引用,并返回该引用。 所以它变成了:

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

答案很简单。

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; } 

肯定会按预期打印“null”