Ссылка на объект установлена в 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
Ответы
Ответ 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. Когда вы вернули ссылку уже, вы не можете изменить ее таким образом.