Метод может не закрыть поток при исключении - PullRequest
7 голосов
/ 17 апреля 2010

Я получаю критическую ошибку с findbugs:

Метод создает объект потока ввода-вывода, не присваивает его никаким полям, передает его другим методам или возвращает его и не закрывает его на всех возможных путях исключений из метода. Это может привести к утечке дескриптора файла. Как правило, рекомендуется использовать блок finally, чтобы обеспечить закрытие потоков.

try {
...
stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
...
} catch (IOException e) {
    throw new RuntimeException(e);
} finally {
    try {
        if (stdError != null) {
            stdError.close();
        }
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

Нужно ли закрыть также InputStreamReader или p.getErrorStream (возвращается InputStream)?

Ответы [ 2 ]

5 голосов
/ 17 апреля 2010

Что происходит при возникновении исключения при создании объекта BufferedReader? Поток, управляемый объектом InputStreamReader, не закрывается до тех пор, пока в будущем сборщик мусора не решит уничтожить объект.

Вероятно, у вас возникнут аналогичные проблемы, если при создании объекта InputStreamReader возникнет исключение.

4 голосов
/ 17 апреля 2010

BufferedReader и InputStreamReader закрывают базовый поток, когда они закрываются. Вы должны быть в порядке, закрыв stdError

...