Задать вопрос
PRAIT
@PRAIT

Почему не закрывается вход и происходит ли утечка ресурсов Java?

Привет ребята.
Написал простую программку консольного ввода, вывод в консоль в netBeans и всё вроде хорошо.
Но вот когда открываю файл в Visual Studio Code он пишет:

[Java] Resource leak: 'input' is never closed [536871799]
Scanner input - readingconsoleinputconsoleoutput.ReadingConsoleInputConsoleOutput.main(String[])



Утечка ресурсов: «вход» никогда не закрывается
Вход для сканера - readconsoleinputconsoleoutput.ReadingConsoleInputConsoleOutput.main (String [])


5c3a77cd5527a930438030.png

Исходный код
package readingconsoleinputconsoleoutput;
import java.util.Scanner;
public class ReadingConsoleInputConsoleOutput {
  public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    String name;
    String surName;
    int yearBorn;
    int yearNow;
    System.out.print("Your name:");
    name = input.nextLine();
    System.out.print("Your middle name:");
    surName = input.nextLine();
    System.out.print("What is the year now?");
    yearNow = input.nextInt();
    System.out.print("What year were you born?");
    yearBorn = input.nextInt();
    System.out.print("Hello, "+name+" "+surName+" ");
    System.out.print("Your age: "+(yearNow-yearBorn)+"");
  }
}


Что самое интересное, делал все по инструкции с книги. Так же, если скопировать весть исходный с книги выдаёт тоже самое. А в netBeans всё в порядке, нет никаких замечаний.
Объясните пожалуйста в чем может быть проблема? Спасибо!
  • Вопрос задан
  • 1742 просмотра
Подписаться 2 Простой Комментировать
Решения вопроса 1
axifive
@axifive
Software Engineer
Необходимо закрыть сканнер, когда вы закончили считывание.
Согласно современному подходу (с JDK 7) следует обернуть в try...catch с автозакрытием ресурсов:
String name;
String surName;
int yearBorn;
int yearNow;
try (Scanner input = new Scanner(System.in)) { // input автоматически закроется
    System.out.print("Your name:");
    name = input.nextLine();
    System.out.print("Your middle name:");
    surName = input.nextLine();
    System.out.print("What is the year now?");
    yearNow = input.nextInt();
    System.out.print("What year were you born?");
    yearBorn = input.nextInt();
    System.out.print("Hello, "+name+" "+surName+" ");
    System.out.print("Your age: "+(yearNow-yearBorn)+"");
} catch(Exception e) {
    //Обработка исключения, если возникло.
    e.printStackTrace();
}


Или устаревший вариант с ручным закрытием:
Scanner input = new Scanner(System.in);
try {
  ...
} catch(Exception e) {
   e.printStackTrace();
} finally {
   input.close(); // Закрываем
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Алексей Т
... современному подходу (с JDK 7) ..... устаревший вариант

тысяча спасибо за классификацию - у вас есть ссылка где сказано что устарело и вообще о lagacях ?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы