1

Когда дело доходит до файла утечки обработки и ресурсов,утечки ресурсов для обработки файлов, попробуйте с ресурсами VS примерочной всеобъемлющими наконец file.close()

каковы преимущества и недостатки между этими двумя способами для решения с проблемой:

попробуйте с ресурсами VS Try/catch/finally с file.close?

Благодаря

  • Pill

ответ

1

Самая большая разница опасность исключения маскирующие с примерки, наконец, подход. Если вы не будете осторожны, чтобы поймать что-либо, заброшенное в конечном блоке на закрытии, вы можете замаскировать любое исключение, созданное в блоке try. Это означает, что если код внутри блока try генерирует исключение, тогда код внутри finally генерирует исключение, исключение, которое распространяется, является тем из блока finally (который обычно не является тем, который вы хотели бы видеть).

try-with-resources устраняет опасность маскировки исключений, убедившись, что если исключение выбрано из блока try, любое исключение, созданное методом close, будет привязано как исключенное исключение.

Случай, когда исключение не выбрасывается в блок try, но исключение, которое бросается на закрытие, обрабатывается по-разному с помощью try-with-resources, чем это было бы, если вы используете try-finally и поймаете все, что было вброшено в блок finally. С try-with-ресурсами исключение, созданное при закрытии, будет выбрано (поскольку исключение не добавлено в качестве исключенного исключения), где обычный подход с try-finally заключается в том, чтобы есть или записывать любое исключение, выведенное из метода finally , Поэтому, если вы не хотите, чтобы ошибка была близка к тому, чтобы вызвать исключение, нарушая некоторую логику, которая в противном случае работала правильно, вы можете избежать попыток использования ресурсов.

Существенным отличием является то, как try-with-resources позволяет использовать несколько ресурсов. Люди, пишущие блоки try-finally, обычно получают нетерпимость от блоков вложенности try и вызывают ошибки с ярлыками, такими как включение слишком большого числа операторов закрытия в блок finally (так что если один из них не удастся, остальные не выполняются, что приведет к утечке ресурсов). try-with-resources гарантирует закрытие ресурсов в правильном порядке на выходе, чтобы не требовалось вложенных блоков.

-1

Я понимаю, что

try(InputStream is = new InputStream(...)){ 
    ... 
} 

функционально эквивалентно:

InputStream is=null; 
try{ 
    is = new InputStream(...); 
    ... 
}finally{ 
    try{ 
     is.close(); 
    }catch(Exception e){} 
} 
+0

Это где-то между упрощением и неправильно. Исключения, вызванные 'close()', не игнорируются. Перевод 'try-with-resources' указан [здесь] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.20.3.1). – Radiodef