ссылка на объект установлена ​​в ноль в блоке finally - PullRequest
12 голосов
/ 07 января 2011
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, а не ноль?

С уважением,
Махендра Атнерия

Ответы [ 3 ]

14 голосов
/ 07 января 2011

Выражение оценивается как значение в операторе возврата, и это значение будет возвращено.Блок finally выполняется после части вычисления выражения оператора return.

Конечно, блок finally может изменить содержимое объекта, на который ссылается возвращаемое значение, например:

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

, в этом случае вывод консоли будет "CoolReturn, я смеюсь последним!"- но он не может изменить значение, которое фактически возвращается.

2 голосов
/ 22 апреля 2013

, похоже, это должно быть нулевым, но с концепцией передачи по ссылке в Java, вот как это происходит:

1> return builder.append("Return") ... выполняется строка и копия метода builder возвращается методу testFinally () путем передачи по ссылке

2> При выполнении builder=null в finally block ссылка builder разыменовывается, но фактический объект, находящийся в куче, на который ссылается ссылка на построитель , ранее существовавшая в куче, и возвращаемая копия ссылки на построитель (которая также является ссылкой на тот же объект) все еще существует, и это удерживая значение «CoolReturn», поэтому печатает возвращаемое значение.

0 голосов
/ 07 января 2011

Блок finally используется для «очистки», после выполнения блока try. Поскольку вы уже вернули ссылку, вы не можете изменить ее таким образом.

...