Ниже приведен упрощенный пример, который будет вызывать вопрос системы Затмения Java предупреждение Potential resource leak: '<unassigned Closeable value>' may not be closed
для выражения new BufferedWriter(...)
:Почему я получаю предупреждение о потенциальной утечке ресурсов с помощью объекта-обертки?
boolean useStdout = askUserWhetherToUseStdout();
Writer writer = useStdout ? new OutputStreamWriter(System.out) : new BufferedWriter(new FileWriter(new File(askUserForFilename())));
try
{
writer.write("Hello World!");
}
finally
{
writer.close();
}
Является ли это ложноположительный? То, как я понял всю статью Писателя, заключается в том, что любой писатель закроет своих основных авторов. В моем случае writer
будет инкапсулировать новый буферизованный писатель (который, в свою очередь, инкапсулирует файловый писатель), и поэтому закрытие writer
не должно утечка каких-либо ресурсов, связанных с буферизованным писателем или, в свою очередь, его основных авторов?
Что мне здесь не хватает?
Спасибо, но на самом деле я забыл добавить 'try' и' catch' в свой пример, так как они находятся в исходном коде. Предупреждение не имеет ничего общего с IOException. Я все равно получаю предупреждение, вы видите. – amn
Если поток, в котором работает ваш код, был убит до выполнения блока finally, блок finally, возможно, никогда не будет выполнен, пока ваше приложение все еще продолжает работать. Dunno, если try-with-resource охватывает этот случай, но кажется вероятным. – Polygnome
Это были важные детали. См. Обновленный ответ. – Perception