Java Сканер - Сборщик мусора - PullRequest
0 голосов
/ 19 июня 2020

Нужно ли закрывать Сканер в этом коде?

public static String input(final String out){
System.out.print(out);
java.util.Scanner sc = new Java.util.Scanner(System.in);
return sc.nextLine();

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Нет, закрывать не нужно. (Даже если ваша IDE говорит, что вы делаете!)

Причина, по которой вам не нужно, состоит в том, что ваш код не отвечал за открытие System.in. JVM сделала это при запуске.

Общий принцип заключается в том, чтобы код, открывший ресурс, отвечал за его закрытие. В этом случае System.in по-прежнему будет доступен для других частей вашего приложения после возврата вызова input. Возможно, его нужно использовать, но если вы закроете его здесь, его нельзя будет использовать. Вызов Scanner.close() попытается закрыть любой источник, который он обертывает.


Однако ваш код (возможно) неверен по другой причине. Если вы собираетесь создать Scanner для System.in, вы должны делать это «глобально», а не каким-либо методом, который можно было бы вызывать из множества мест.

Почему?

Потому что вы можете безопасно обернуть заданный объект входного потока в Scanner только один раз.

  1. Scanner берет на себя управление жизненным циклом потока.
  2. Scanner может заранее прочитать в буфере произвольное количество символов из потока, что делает их недоступными для чего-то еще; например, другой Scanner. Таким образом, две Scanners попытки чтения из одного потока могут неожиданно потерять символы.

Закрытие Scanner закроет обернутый источник, независимо от того, делаете ли вы это явно или через try-with -ресурсы . Однако Scanner не может быть финализирован ... это означает, что G C не будет пытаться закрыть обернутый источник только потому, что Scanner становится недоступным.

0 голосов
/ 19 июня 2020

Проверить с помощью

import java .util.Scanner; publi c stati c ввод строки (окончательный вывод строки) {String str = ""; System.out.print (выход); Сканер s c = новый Сканер (System.in); while (s c .hasNextLine ()) {str = s c .nextLine ();

}

    return str; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...