Метод может не закрыть поток при исключении

Я получаю критическую ошибку с 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)?


person IAdapter    schedule 17.04.2010    source источник


Ответы (2)


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

person Guillaume    schedule 17.04.2010

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

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

person Matthew T. Staebler    schedule 17.04.2010
comment
Вы и findbugs технически правы. Однако единственный способ, которым конструктор BufferedReader может дать сбой, — это Error; например ООМЭ или СОЭ. Приложение вряд ли попытается восстановиться после одного из них, поэтому утечка потока вряд ли будет иметь значение. - person Stephen C; 17.04.2010