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
答案 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块后。当您已经返回引用时,您无法以这种方式更改它。