Хорошо, вы привели плохой пример - я подозреваю, что вы имели в виду что-то вроде FileInputStream
- но основная причина в том, что Java не имеет детерминированной финализации.
Область действия переменной f
заканчивается блоком, в котором она объявлена (не блоком try
), но это не означает, что необязательно нет «живых» ссылок на объект больше - и сборщик мусора не будет ни завершать объект, ни собирать мусор каким-либо детерминистическим способом.
Если вы не хотите оставлять ресурсы без присмотра на произвольный промежуток времени (и откладывать сборку мусора, поскольку финализаторам требуется дополнительный раунд сбора перед окончательным освобождением памяти), вам следует явно закрыть ресурсы.
В основном Java не поддерживает RAII так же, как C ++; Вы не должны пытаться использовать его, как если бы это был C ++.