Как прочитать строку с консоли? NoSuchElementException: строка не найдена - PullRequest
0 голосов
/ 06 августа 2020

Мне нужно реализовать интерфейс Терминал , который имеет два метода. Первый метод - это простой вывод, и он отлично работает. Цель второго метода - прочитать ввод от пользователя через консоль и вернуть разделенный (пробелы) массив.

public class GameTerminal implements Terminal {

    @Override
    //output method

    @Override
    public String[] readInput() {
        Scanner scn = new Scanner(System.in);
        String input = scn.nextLine();
        return input.trim().split("\\s+");
    }

}

Этот код выдает исключение:

Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.util.Scanner.nextLine(Scanner.java:1540)
    at student.GameTerminal.readInput(GameTerminal.java:20)
    ...

I попытался решить проблему с использованием scn.next () , scn.hasNext () , scn.hasNextLine () и BufferedReader, но ничего не работает. У меня нет второго сканера , и я не использую scn.close () .

Код работает с gradle в IntelliJ.

Имеет есть решение или идея? Спасибо!

1 Ответ

1 голос
/ 07 августа 2020

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

public class GameTerminal implements Terminal {
    private Scanner scn = new Scanner(System.in);
    ...
    public String[] readInput() {
        String input = scn.nextLine();
        return input.trim().split("\\s+");
    }
}

Простой драйвер:

public class Example {
    public static void main(String[] args) throws Exception {
        GameTerminal terminal = new GameTerminal();
        String[] tokens = null;

        while ((tokens = terminal.readInput()) != null) {
            System.out.println(Arrays.toString(tokens));
        }
    }
}

Тестовый запуск:

$(/usr/libexec/java_home -v 11)/bin/java Example.java
some tokens
[some, tokens]
some more tokens
[some, more, tokens]
...