как использовать два сканера на одном методе - PullRequest
0 голосов
/ 20 октября 2018

ранее сегодня я спросил , как повторно попытаться / поймать исключение несоответствия ввода без попадания в бесконечный цикл

, но это процесс с двумя процедурами, сначала игра попросит пользователяразмер сетки и позже после запуска ему будет предложено либо установить флаг, либо перешагнуть через ячейку (если моя игра закончится, иначе будет напечатано количество окружающих мин), но я получаю некоторую странностьошибки код:

int gridSize = 0;
    try (Scanner scanner = new Scanner(System.in)) {
        System.out.println("how much the size of the grid do you want");
        while (!scanner.hasNextInt()) {
            System.err.println("Try again, this time with a proper int");
            scanner.next();
        }
        gridSize = scanner.nextInt();
    }
    MinesWeeper grid = new MinesWeeper(gridSize);
    grid.printOut();

    int choice = 0;
    try (Scanner scanner = new Scanner(System.in)) {
        System.out.println("1-to step over a cell\n2-to set a flag on the cell");
        while (!scanner.hasNextInt()) {
            System.err.println("Try again, this time with a proper int");
            scanner.next();
        }
        choice = scanner.nextInt();
    }

    boolean Continue = true;
    while (Continue) {
        switch (choice) {
            case 1:
                if (grid.chooseCell(1)) {
                    Continue = false;
                }
                break;
            case 2:
                grid.chooseCell(2);
                break;
        }
    }

ошибки:

how much the size of the grid do you want 3 A B C<br> Try again, this time with a proper int 1 * * * Exception in thread "main" java.util.NoSuchElementException 2 * * * at java.util.Scanner.throwFor(Scanner.java:862) 3 * * * 1-to step over a cell at java.util.Scanner.next(Scanner.java:1371) at Array.Main.main(MinesWeeper.java:188) 2-to set a flag on the cell

странная вещь, что он печатает сообщения об исключениях между моими операторами печати (сетка - это одно утверждение, инструкциитоже один)

когда я выполнил поиск, я обнаружил, что не могу использовать два сканера в одном месте, но как их разделить, если они инициализируются при попытке с ресурсами

1 Ответ

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

Это:

try (Scanner scanner = new Scanner(System.in)) {
  // ...
}

- это блок проб с ресурсами.Когда блок завершит выполнение, он вызовет scanner.close().

. Проблема с этим для вашего случая использования в том, что сканер, в свою очередь, вызывает System.in.close().После того, как поток был закрыт, вы не можете читать его снова, поэтому вы получите исключение при попытке создать другое чтение сканера из System.in впоследствии.

Самое простое исправление вашего кода -объединить два блока try-with-resources и повторно использовать один и тот же сканер, чтобы не закрывать его между ними.В любом случае нет веской причины иметь два отдельных сканера.

Но на самом деле вам вообще не следует использовать try-with-resources.

Общее правило: незакройте поток, который вам не принадлежит , что примерно означает не закрывайте поток, который вы не открыли , учитывая, что в Java нет понятия «владение».Вы не открыли System.in, JVM открыла.

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

Теперь вы можете подумать , что вам нужно использовать twr, потому что ваша IDEв противном случае помечает предупреждение о утечке ресурсов на сканере.Как правило, вы можете закрыть сканер;в этом конкретном случае вы этого не сделаете.Игнорируйте (или подавляйте) это предупреждение, если именно поэтому вы используете twr.

...