Уроки часто устарели или не описывают хорошую практику.
Если мы посмотрим на первый фрагмент кода, который вы процитировали, br
никогда не может быть null
.if ( )
можно удалить.Вероятно, это было вызвано предыдущим кодом из-за предыдущего микширования кода до finally
с catch
.Если оператор try
имеет и finally
, и catch
, это, вероятно, неправильно и почти наверняка делает что-то дурное.Обычно вы наблюдаете танец null
и по крайней мере одну очевидную ошибку.
Полученная мудрость в этом вопросе заключается в том, что BufferedReader
потерпит неудачу, только если что-то пошло не так со всем вашим процессом.Возможно, недостаточно памяти или стек переполнен.Если вы получаете такого рода исключения, вы, вероятно, захотите спасти их вообще.
Педантичный способ написания кода без try-with-resource:
FileReader fr = new FileReader(path);
try {
BufferedReader br = new BufferedReader(fr);
return br.readLine();
} finally {
fr.close();
}
Однако в некоторыхна случай, если вы ошибетесь.Считается BufferWriter
.Вы забыли flush
, не так ли?Я имею в виду, я бы.Если вы закроете это в finally
, это не будет проблемой.Также некоторые декораторы сами являются ресурсами.Например, они могут иметь встроенную реализацию, которая использует не собранную память.Это не обязательно задокументировано.
Закрытие как ресурса, так и декоратора не сложно, но движется вправо без попытки с ресурсом.
// (Using same example even though it doesn't matter here - imaging a Writer)
FileReader fr = new FileReader(path);
try {
BufferedReader br = new BufferedReader(fr);
try {
return br.readLine();
} finally {
br.close();
}
} finally {
fr.close();
}