Как использовать сканер только один раз, а затем избавиться от него?

У меня есть программа на java, в которой я должен получить пользовательский ввод, однако мне нужно получить пользовательский ввод только один раз, после этого мне больше не нужен сканер. Делаем следующее:

int userInput = new Scanner(System.in).nextInt();

Выдает мне предупреждение об утечке ресурсов, говоря, что <unassigned closeable value> is never closed.

Есть ли другой способ использовать сканер только один раз, а потом избавиться от него, чтобы не было утечки ресурсов? Может быть, что-то похожее на оператор C # using.


person Shadow    schedule 18.10.2014    source источник


Ответы (3)


Эквивалентом using в C# является try-with-resources. Не используйте это, это закроет System.in, а вам это не нужно. Игнорируйте предупреждение для этого конкретного случая. Пусть сборщик мусора потребует Scanner и оставит стандартный ввод как есть.

person Sotirios Delimanolis    schedule 18.10.2014

Я вижу следующие два варианта... Вариант №1: Явно закрыть сканер, как только вы прочитаете ввод один раз.

Scanner sc = new Scanner(System.in);
int userInput = sc.nextInt();
sc.close();

Вариант № 2. Используйте оператор try-with-resource.

try(Scanner sc1 = new Scanner(System.in)) {
   int userInput1 = sc1.nextInt();
}

Недостатком варианта № 2 является то, что он закроет все ресурсы, которые существуют в операторе try-with-resource, включая System.in.

person Nagakishore Sidde    schedule 18.10.2014

Java имеет автоматическую сборку мусора. Автоматическая сборка мусора — это процесс просмотра памяти кучи, определения того, какие объекты используются, а какие нет, и удаления неиспользуемых объектов. Используемый объект или объект, на который ссылаются, означает, что некоторая часть вашей программы все еще поддерживает указатель на этот объект. На неиспользуемый объект или объект, на который нет ссылки, больше не ссылается ни одна часть вашей программы. Таким образом, память, используемая объектом, на который нет ссылки, может быть восстановлена.
Это означает, что вы не должны беспокоиться об этом типе предупреждений. Кроме того, в Eclipse вы можете использовать@SuppressWarning, чтобы избавиться от надоедливых предупреждений.

person iColdBeZero    schedule 18.10.2014