Что не происходит утечка ресурсов при объявлении переменной сканера в поле данных класса? - PullRequest
0 голосов
/ 05 марта 2020

Когда я пишу это:

import java.util.*;

public class Test {

//  static Scanner input = new Scanner(System.in);
    static double y;

    public static void main(String[] args) {
        double x = someMethod(5);
    }

    private static double someMethod(int nr) {
        Scanner input = new Scanner(System.in);
        try {
            y = input.nextDouble();
        } catch (InputMismatchException e) {System.out.println("Type in a double");}
        return y + nr;
    }
}

Я получаю сообщение об ошибке "утечка ресурсов".

Но когда я пишу это:

import java.util.*;

public class Test {

    static Scanner input = new Scanner(System.in);
    static double y;

    public static void main(String[] args) {
        double x = someMethod(5);
    }

    private static double someMethod(int nr) {
        try {
            y = input.nextDouble();
        } catch (InputMismatchException e) {System.out.println("Type in a double");}
        return y + nr;
    }
}

Это просто работает. Почему нет утечки ресурсов при определении входного сканера в поле данных класса?

В чем разница между объявлением переменной в поле данных и метода в методе?

1 Ответ

1 голос
/ 05 марта 2020

Когда у вас есть Scanner input = new Scanner(System.in); в методе, вы создаете new Scanner экземпляр каждый раз, когда метод вызывается, и вы используете его только один раз. Это создает мусор, потому что теперь у вас будет новый сканер, который больше не используется каждый раз, когда вы используете метод.

Если вместо этого вы создаете экземпляр Scanner в классе, вы создаете его один раз и повторно используйте , чтобы ваша программа не имела мусора.

...