Обычно, когда вы создаете Scanner
, вам нужно закрыть , когда он вам больше не нужен.
Класс Scanner
имеет несколько , перегруженные конструкторы, каждый из которых принимает разные типы аргументов. Существует конструктор, который принимает аргумент File
. Существует конструктор, который принимает аргумент Path
. И есть конструктор, который принимает аргумент InputStream
. Чтобы ваша программа Java принимала ввод от пользователя через клавиатуру компьютера, вы используете конструктор, который принимает InputStream
, например:
Scanner scanner = new Scanner(System.in);
Это потому, что stati c член in
класса java.lang.System
имеет тип InputStream
. Вы должны думать о System.in
как об инкапсулировании клавиатуры на вашем компьютере. Если вы закроете System.in
, это будет похоже на закрытие клавиатуры, а этого делать не следует.
Теперь Eclipse IDE недостаточно умен, чтобы понять, что ваш код создает Scanner
, который, по сути, заключает в себе клавиатуру компьютера (и поэтому не должен быть закрыт). Eclipse знает только, что любой Scanner
, который вы создаете, должен в конечном итоге быть закрыт, и поскольку ваш код не закрывает Scanner
, который вы создали, Eclipse отображает предупреждение, которое вы не сделали. закрыл созданный вами Scanner
. В отображаемом предупреждении вам предлагаются три предложения о том, как избавиться от предупреждения. Первые два относятся к аннотации, которую вы можете добавить, а именно
@SuppressWarnings("resource")
Третье предложение требует, чтобы вы изменили конфигурацию Eclipse . Вы делаете это, выбирая пункт Preferences в меню Window , которое появляется в верхней части Eclipse IDE. В окне Preferenes выберите Java> Compiler> Errors / Warnings и измените настройку Resource leak на Игнорировать, как показано на следующем снимке экрана:
Однако обратите внимание, что этот параметр конфигурации применяется к всем ресурсам, а не только Scanner
, поэтому, если вы откроете обычный файл в своем java код и не закрывайте его, Eclipse не предупредит вас.
Лично я просто игнорирую предупреждение, так как знаю, что не должен закрывать Scanner
, созданный с помощью System.in
или добавляю аннотацию.