Подтвердить что ты не робот

Ссылка на объект установлена ​​в null в блоке 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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

По-видимому, он выглядит как null, но с понятием pass by reference в java вот как это делается:

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

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

Ответ 3

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