对象引用在finally块中设置为null

Mah*_*ria 12 java finally try-finally

public void testFinally(){
System.out.println(setOne().toString());

}

protected StringBuilder setOne(){
StringBuilder builder=new StringBuilder();
try{
builder.append("Cool");
return builder.append("Return");
}finally{
builder=null; /* ;) */
}
}
Run Code Online (Sandbox Code Playgroud)

为什么输出是CoolReturn,而不是null?

此致,
Mahendra Athneria

Jon*_*eet 14

表达式被计算为return语句中的值,这是将返回的值.finally块在return语句的表达式求值部分之后执行.

当然,finally块可以修改返回值引用的对象的内容 - 例如:

finally {
  builder.append(" I get the last laugh!");
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,控制台输出将是"CoolReturn我笑到最后!" - 但它无法更改实际返回的值.

  • @Darin:append方法返回到调用它的变量的链接.所以返回builder.append("some value"); 实际上将"some value"附加到构建器并返回构建器作为对象的链接,您在finally块中更改它.当您编写builder = null时,您只需更改构建器点的位置,而不是位于旧链接下的值. (3认同)
  • @Darin:因为`builder`是一个参考.将引用设置为null会取消设置所述引用,但它引用的对象仍然存在,直到它被垃圾回收.另一方面,`append`修改对象(或其中一个属性) (2认同)