Объект Scanner, на который нет ссылки, закрывается автоматически?

Этот вопрос является дубликатом этого вопроса, но ни один из них не ответил, можно ли его закрыть.

Они только предлагали альтернативы — использование try-with или фактически наличие ссылки, например Scanner scanner=new Scanner(System.in).

Это привело меня к мысли, что неиспользуемые объекты Scanner не могут быть закрыты, но...

Вопрос: Разве объекты не должны стать доступными для сборки мусора и, следовательно, в конечном итоге будут закрыты?
(Примечание: я понимаю, что зависимость от GC — не лучшая идея)

Scanner не закрывается автоматически. Обратите внимание, что закрытие scanner здесь также закроет System.in (глобальное значение).
Elliott Frisch 16.12.2020 00:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
162
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Глядя на исходный код OpenJDK, Scanner не переопределяет метод finalize. Это означает, что при окончательном сборе объекта не выполняется никакого специального кода, и вам необходимо явно закрыть его.

Обновлено:
Это, вероятно, сделано намеренно, так как общий вариант использования Scanner — использовать его на System.in, который вы никогда не должны закрывать.

Короче говоря, объект собран мусором, но базовый поток все еще открыт?

HelloWorld 16.12.2020 01:15

@HelloWorld да, точно

Mureinik 16.12.2020 05:06

В общем, объекты, обертывающие другой ресурсный объект, никогда не будут иметь закрывающего их финализатора, так как всегда возможно, что обертка получает сбор мусора, в то время как базовый ресурс все еще используется, как в этом вопросе и ответе . Таким образом, у Scanner нет финализатора или очистителя, но есть базовый ресурс, например. при упаковке FileInputStream, может быть. Тем не менее, это не приглашение полагаться на сборку мусора ресурсов. Случай System.in особенный…

Holger 16.12.2020 11:01

Другие вопросы по теме