Нет, закрывать не нужно. (Даже если ваша IDE говорит, что вы делаете!)
Причина, по которой вам не нужно, состоит в том, что ваш код не отвечал за открытие System.in
. JVM сделала это при запуске.
Общий принцип заключается в том, чтобы код, открывший ресурс, отвечал за его закрытие. В этом случае System.in
по-прежнему будет доступен для других частей вашего приложения после возврата вызова input
. Возможно, его нужно использовать, но если вы закроете его здесь, его нельзя будет использовать. Вызов Scanner.close()
попытается закрыть любой источник, который он обертывает.
Однако ваш код (возможно) неверен по другой причине. Если вы собираетесь создать Scanner
для System.in
, вы должны делать это «глобально», а не каким-либо методом, который можно было бы вызывать из множества мест.
Почему?
Потому что вы можете безопасно обернуть заданный объект входного потока в Scanner
только один раз.
-
Scanner
берет на себя управление жизненным циклом потока. Scanner
может заранее прочитать в буфере произвольное количество символов из потока, что делает их недоступными для чего-то еще; например, другой Scanner
. Таким образом, две Scanners
попытки чтения из одного потока могут неожиданно потерять символы.
Закрытие Scanner
закроет обернутый источник, независимо от того, делаете ли вы это явно или через try-with -ресурсы . Однако Scanner
не может быть финализирован ... это означает, что G C не будет пытаться закрыть обернутый источник только потому, что Scanner
становится недоступным.