Поскольку разработчики Java смогли увидеть проблемы, возникшие с обработкой исключений-исключений в блоках .NET using
, прежде чем реализовать свою собственную функцию try-with-resources, они смогли улучшить ее. В .NET автору блока Dispose
часто приходится сталкиваться с неприятным выбором между проглатыванием любых исключений, которые возникают, что позволяет ошибочно разрешить вызывающей программе считать, что все в порядке или разрешить исключения, исходящие от Dispose
, таким образом, чтобы стереть любые доказательства любого предыдущего исключения. К счастью, Java избегает этой проблемы.
Если блок try-with-resources преуспевает нормально, и close
также успешно работает, тогда внешний код видит все как обычно. Если в разделе try
возникает исключение, но close
успешно выполняется нормально, внешний код будет видеть исключение try-block. Если try
завершается нормально, но выбрасывает close
, внешний код будет видеть исключение close
.И если try
выбрасывает, но close
также выбрасывает, то внешний код будет видеть исключение try
, но также сможет получить любое исключение, которое произошло в пределах close
(и если несколько вложенных исключений try-with-resources в течение close
, все заброшенные исключения будут доступный внешнему коду).
Следовательно, в отличие от конструкции .NET, который часто вынуждает авторов задушить некоторые потенциально серьезные исключения, брошенные Dispose
, дизайн благосклонности Явы, имеющие close
сгенерирует исключение в любое время что-то идет достаточно неправильно, что абонент не должно быть позволено верить что все в порядке.
Попробуйте http://stackoverflow.com/questions/4679409/how-to-properly-handle-an-ioexception-from-close –