Q: помогите понять закрытие сканера - PullRequest
0 голосов
/ 11 октября 2018

Это мой рабочий код.

public static void play() {

    Scanner myScanner = new Scanner(System.in);
    Scanner myOtherScanner = new Scanner(System.in);

    while (!endCondition()) {
        //stuff
        shoot(myScanner);
    }

    keepPlaying(myOtherScanner);

    myScanner.close();
    myOtherScanner.close();
}

Метод получения myScanner:

static void shoot(Scanner sc) {
    int bullet;
    //Stuff

    bullet = Integer.parseInt(sc.next());

    //More stuff
}

Метод получения myOtherScanner:

static void keepPlaying(Scanner myOtherScanner) {

    //Stuff

    int option = Integer.parseInt(myOtherScanner.next());

    //More stuff
}

Что теперьЯ не понимаю:

Если я закрою myScanner перед вызовом keepPlaying(myOtherScanner), myOtherScanner.next() выдаст:

NoSuchElementException

Сто, что я обнаружил, похоже, что закрытие одного сканера закрывает System.in.Это правильно?

Какой хороший способ обойти это?Закрытие только в самом конце?

Лучше ли использовать один Scanner?

Использую ли я Scanners в качестве элементов глобального класса?

Разве я не закрываю Scanners?

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Обходной путь для этого - создать свой собственный java.io.FilterInputStream.

Scanner myScanner = new Scanner(new FilterInputStream(System.in) {
    public void close() throws IOException {
    }
});

Теперь, когда вы звоните,

myScanner.close();

он закрывает только ваши FilterInputStream, оставляя System.in open ( Source ) .


Или вы можете просто использовать один Scanner, если ваше приложение однопоточное.

0 голосов
/ 11 октября 2018

Когда вы вызываете .close() на любом ресурсе, как вы звоните myScanner.close();, он также закрывает ресурс и in поток.

Когда входной поток закрывается, его нельзя открыть (так каксогласно javadoc) и поскольку вы используете один и тот же поток System.in в обоих сканерах, как только он закрывается myscanner, он недоступен для myOtherScanner, поэтому он дает исключение.

...