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
表达式被计算为return语句中的值,这是将返回的值。执行finally块 后 return语句的表达式评估部分。
当然,finally块可以修改返回值引用的对象的内容 - 例如:
finally {
builder.append(" I get the last laugh!");
}
在这种情况下,控制台输出将是“CoolReturn我笑到最后!” - 但它不能更改实际返回的值。
表达式被计算为return语句中的值,这是将返回的值。执行finally块 后 return语句的表达式评估部分。
当然,finally块可以修改返回值引用的对象的内容 - 例如:
finally {
builder.append(" I get the last laugh!");
}
在这种情况下,控制台输出将是“CoolReturn我笑到最后!” - 但它不能更改实际返回的值。
显然它看起来应该是null但是在java中通过引用传递的概念是这样的:
1>返回 builder.append("Return")
...行被执行和副本 建设者 引用返回给 testFinally() 通过引用传递的方法
2>执行时 builder=null
在 最后 阻止 建设者 引用被取消引用但是在引用的堆中的实际对象 建设者 之前仍然存在于堆中的引用和 返回的构建器引用副本 (它也是指向同一个对象的引用)仍然存在并且保持值“CoolReturn”,这就是为什么它打印返回的值。
finally块用于“清理”, 后 try块的执行。当您已经返回引用时,您无法以这种方式更改它。