12
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 Atheria

4

3 回答 3

14

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

当然,finally 块可以修改返回值所指对象的内容——例如:

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

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

于 2011-01-07T12:57:24.030 回答
2

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

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

2>builder=nullfinally块中执行时,构建器引用被取消引用,但堆中的实际对象(之前由构建器引用引用)仍然存在于堆中,并且构建器引用的返回副本(这也是指向的引用)同一个对象)仍然存在并且它持有值 "CoolReturn" ,这就是它打印返回值的原因。

于 2013-04-22T13:06:49.693 回答
0

在执行 try 块之后,finally 块用于“清理” 。由于您已经返回了参考,因此您不能以这种方式更改它。

于 2011-01-07T12:57:43.580 回答