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

时间:2011-01-07 12:55:50

标签: 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; /* ;) */
}
}

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

的问候,
Mahendra Athneria

3 个答案:

答案 0 :(得分:14)

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

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

finally {
  builder.append(" I get the last laugh!");
}

在这种情况下,控制台输出将是“CoolReturn我笑到最后!” - 但它不能改变实际返回的值。

答案 1 :(得分:2)

显然它看起来应该是null但是在java中通过引用传递的概念是这样的:

1>返回builder.append("Return") ...行执行,构建器引用的副本通过引用传递返回到 testFinally()方法

2 - ;在最终阻止中执行builder=null时, 构建器 引用会被取消引用,但是堆中的实际对象会被引用早期仍然存在于堆中的构建器引用和 返回的构建器引用副本 (它也是指向同一对象的引用)仍然存在并保持值“CoolReturn”,这就是为什么它打印返回值。

答案 2 :(得分:0)

finally块用于“清理”,用于执行try块后。当您已经返回引用时,您无法以这种方式更改它。