Этот вопрос является дубликатом этого вопроса, но ни один из них не ответил, можно ли его закрыть.
Они только предлагали альтернативы — использование try-with или фактически наличие ссылки, например Scanner scanner=new Scanner(System.in).
Это привело меня к мысли, что неиспользуемые объекты Scanner не могут быть закрыты, но...
Вопрос: Разве объекты не должны стать доступными для сборки мусора и, следовательно, в конечном итоге будут закрыты?
(Примечание: я понимаю, что зависимость от GC — не лучшая идея)




Глядя на исходный код OpenJDK, Scanner не переопределяет метод finalize. Это означает, что при окончательном сборе объекта не выполняется никакого специального кода, и вам необходимо явно закрыть его.
Обновлено:
Это, вероятно, сделано намеренно, так как общий вариант использования Scanner — использовать его на System.in, который вы никогда не должны закрывать.
Короче говоря, объект собран мусором, но базовый поток все еще открыт?
@HelloWorld да, точно
В общем, объекты, обертывающие другой ресурсный объект, никогда не будут иметь закрывающего их финализатора, так как всегда возможно, что обертка получает сбор мусора, в то время как базовый ресурс все еще используется, как в этом вопросе и ответе . Таким образом, у Scanner нет финализатора или очистителя, но есть базовый ресурс, например. при упаковке FileInputStream, может быть. Тем не менее, это не приглашение полагаться на сборку мусора ресурсов. Случай System.in особенный…
Scannerне закрывается автоматически. Обратите внимание, что закрытиеscannerздесь также закроетSystem.in(глобальное значение).