Второй вызов метода для чтения из командной строки завершается с ошибкой ввода-вывода Java: поток закрыт - PullRequest
0 голосов
/ 19 июня 2019

У меня есть два последовательных вызова метода, который использует BufferedReader вместо InputStreamReader для чтения строки ввода с клавиатуры. Это два звонка -

    System.out.println("Enter size of array for hash table...");
    size = getInt();

    System.out.println("Enter initial number of items...");
    numInitial = getInt();

Проблема в том, что, хотя первый вызов работает правильно, второй сбой происходит с исключением -

Enter size of array for hash table...
12
Enter initial number of items...
java.io.IOException: Stream closed
Exception in thread "main" java.lang.NumberFormatException: null
    at java.base/java.lang.Integer.parseInt(Integer.java:620)
    at java.base/java.lang.Integer.parseInt(Integer.java:776)
    at hashing.HashTableApp.getInt(HashTableApp.java:28)
    at hashing.HashTableApp.main(HashTableApp.java:48)

Это мои определения методов -

public static String getString() {
    String s;
    try(BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
        s = br.readLine();
    }
    catch(IOException e) {
        s = null;
        System.out.println(e);
    }

    return s;   
}

public static int getInt() {
    String s = getString();
    return Integer.parseInt(s);
}

Глядя на сообщение об исключении, похоже, что поток закрывается после первого вызова getInt(), а затем происходит сбой при втором вызове getInt() при попытке чтения из командной строки. Однако я не уверен, почему это происходит. Обычно эта проблема возникает, когда кто-то пытается прочитать из потока, который уже закрыт, как описано ранее в этом вопросе .

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

Для некоторого контекста это в значительной степени тот же код из книги Я читаю о хешировании, за исключением структуры try-with-resources.

...