Почему Eclipse дает мне теплые слова «Утечка ресурсов: 'in' никогда не закрывается» в следующем коде?
public void readShapeData() {
Scanner in = new Scanner(System.in);
System.out.println("Enter the width of the Rectangle: ");
width = in.nextDouble();
System.out.println("Enter the height of the Rectangle: ");
height = in.nextDouble();
Scanner
и отключит предупреждение, но оно также закроется,System.in
что обычно нежелательно.System.in
обычно нежелательно. Это потому, что вы больше не сможете читать его. I. e. получишь,java.util.NoSuchElementException: No line found
если попробуешь позвонить(new Scanner(System.in)).nextLine()
например.Как говорили другие, вам нужно вызвать «закрыть» классы ввода-вывода. Я добавлю, что это отличное место для использования блока try - finally без каких-либо уловок, например:
public void readShapeData() throws IOException { Scanner in = new Scanner(System.in); try { System.out.println("Enter the width of the Rectangle: "); width = in.nextDouble(); System.out.println("Enter the height of the Rectangle: "); height = in.nextDouble(); } finally { in.close(); } }
Это гарантирует, что ваш сканер всегда закрыт, что гарантирует надлежащую очистку ресурсов.
Точно так же в Java 7 или выше вы можете использовать синтаксис «попробуйте с ресурсами»:
try (Scanner in = new Scanner(System.in)) { ... }
источник
Вам нужен звонок
in.close()
вfinally
блоке, чтобы убедиться, что это произойдет.Из документации Eclipse, вот почему он отмечает эту конкретную проблему ( выделено мной ):
Полное объяснение здесь .
источник
Это говорит вам , что вам нужно , чтобы закрыть сканер вы инстанцированный на
System.in
сScanner.close()
. Обычно каждый ридер должен быть закрыт.Обратите внимание: если вы закроете
System.in
, вы больше не сможете читать его. Вы также можете взглянуть наConsole
класс.public void readShapeData() { Console console = System.console(); double width = Double.parseDouble(console.readLine("Enter the width of the Rectangle: ")); double height = Double.parseDouble(console.readLine("Enter the height of the Rectangle: ")); ... }
источник
System.console()
это недоступно при запуске приложения через Eclipse, что может вызвать проблемы во время разработки.Если вы используете JDK7 или 8, вы можете использовать try-catch с ресурсами. Это автоматически закроет сканер.
try ( Scanner scanner = new Scanner(System.in); ) { System.out.println("Enter the width of the Rectangle: "); width = scanner.nextDouble(); System.out.println("Enter the height of the Rectangle: "); height = scanner.nextDouble(); } catch(Exception ex) { //exception handling...do something (e.g., print the error message) ex.printStackTrace(); }
источник
try
как показано, и не использоватьcatch
предложение.// An InputStream which is typically connected to keyboard input of console programs Scanner in= new Scanner(System.in);
Вышеупомянутая строка вызовет конструктор класса Scanner с аргументом System.in и вернет ссылку на вновь созданный объект.
Он подключен к входному потоку, который подключен к клавиатуре, поэтому теперь во время выполнения вы можете использовать пользовательский ввод для выполнения необходимой операции.
//Write piece of code
Чтобы убрать утечку памяти -
in.close();//write at end of code.
источник
Вы должны закрыть свой сканер, когда закончите с ним:
источник
добавление на
private static Scanner in;
самом деле не решает проблему, оно только очищает предупреждение. Создание статического сканера означает, что он остается открытым навсегда (или до тех пор, пока класс не будет выгружен, что почти «навсегда»). Компилятор больше не выдаст вам предупреждений, поскольку вы сказали ему «держать его открытым навсегда». Но это не то, чего вы действительно хотели, поскольку вам следует закрыть ресурсы, как только они вам больше не понадобятся.HTH, Манфред.
источник
Как правило, экземпляры классов, которые имеют дело с вводом-выводом, должны быть закрыты после того, как вы закончите с ними. Итак, в конце вашего кода вы можете добавить
in.close()
.источник
private static Scanner in;
Я исправил это, объявив in как частную статическую переменную класса Scanner. Не знаю, почему это исправлено, но я рекомендовал сделать именно это.
источник
Сканер должен быть закрыт. Рекомендуется закрывать Readers, Streams ... и подобные объекты, чтобы освободить ресурсы и избежать утечек памяти; и сделать это в блоке finally, чтобы убедиться, что они закрыты, даже если при обработке этих объектов возникает исключение.
источник
scanner.close()
", но этот ответ действительно помогает ему / ей понять, что происходит. +1Ладно, серьезно, по крайней мере, во многих случаях это на самом деле ошибка. Он также отображается в VS Code, и линтер замечает, что вы достигли конца охватывающей области, не закрывая объект сканера, но не осознавая, что закрытие всех открытых файловых дескрипторов является частью завершения процесса. Утечки ресурсов нет, потому что все ресурсы очищаются при завершении, и процесс завершается, не оставляя места для хранения ресурса.
источник
Scanner sc = new Scanner(System.in); //do stuff with sc sc.close();//write at end of code.
источник
Он закроет
Scanner
и закроет предупреждение.источник