Почему я не могу просто создать другой объект сканера после использования scanner.close ()? - PullRequest
0 голосов
/ 05 октября 2019

После использования метода scanner.close () я не могу открыть другой сканер. Я искал свой вопрос в Google, чтобы найти людей, которые предлагают решение для обходного пути. Я просто хочу понять, почему это проблема в первую очередь. Может кто-нибудь объяснить, почему?

import java.util.Scanner;

public class Main {

    public static Scanner scan = new Scanner(System.in);

    public static void main(String[] args) {
        scan.close();

        Scanner scan = new Scanner(System.in);

        System.out.println(scan.next());  //NoSuchElementException
    }

}

Я понимаю, что одновременное открытие нескольких сканеров может привести к ошибке outOfMemoryError, поэтому я подумал, почему бы не использовать ее как одноэлементный служебный класс, из которого можно вызывать методы? Этот класс будет открывать и закрывать сканер при каждом использовании, так что потоки не должны оставаться открытыми.

public class Main {

    public static void main(String[] args) {
        LinkedList<Scanner> list = new LinkedList<>();
        while(true) {
            list.add(new Scanner(System.in)); //OutOfMemoryError
        }
    }
}

, что возвращает нас к корню моего вопроса, если мы все сможем понять, почему работает класс сканераТаким образом, возможно, мы могли бы найти решение?

1 Ответ

5 голосов
/ 05 октября 2019

С документация для Scanner.close():

, если его базовый читаемый объект также реализует интерфейс Closeable, а затем читаемый метод closeбудет вызван.

Поэтому, когда вы закрываете сканер, он также закрывает System.in, что означает, что вы не сможете позже сделать из него новый сканер, так как вы не можете повторно открыть поток один раз. он закрыт.

И во втором примере вы получаете OutOfMemoryError только потому, что пытаетесь выделить бесконечное количество сканеров и не позволяете им собирать мусор, а не потому, что сканеры особенно тяжелые.

...