Spec-Zone .ru
спецификации, руководства, описания, API
|
finally
блок всегда выполняется когда try
блочные выходы. Это гарантирует что finally
блок выполняется, даже если происходит неожиданное исключение. Но finally
полезно для больше чем только обработки исключений — она позволяет программисту избегать иметь код уборки, случайно обошедший a return
, continue
, или break
. Помещение уборки кодирует в a finally
блок всегда является хорошей практикой, даже когда никакие исключения не ожидаются.
try
или catch
код выполняется, тогда finally
блок, возможно, не выполняется. Аналогично, если поток, выполняющийся try
или catch
код прерывается или уничтожается, finally
блок, возможно, не выполняется даже при том, что приложение в целом продолжается. try
блок writeList
метод, с которым Вы работали здесь, открывает a PrintWriter
. Программа должна закрыть тот поток прежде, чем выйти writeList
метод. Это излагает несколько сложную проблему потому что writeList
's try
блок может выйти одним из трех способов.
new FileWriter
оператор приводит к сбою и бросает IOException
.vector.elementAt(i)
оператор приводит к сбою и бросает ArrayIndexOutOfBoundsException
.try
блокируйте выходы обычно.Система времени выполнения всегда выполняет операторы в пределах finally
блок независимо от того, что происходит в пределах try
блок. Таким образом, это - совершенное место, чтобы выполнить уборку.
Следующий finally
блок для writeList
метод очищает и затем закрывается PrintWriter
.
finally { if (out != null) { System.out.println("Closing PrintWriter"); out.close(); } else { System.out.println("PrintWriter not open"); } }
В writeList
пример, Вы могли предусмотреть уборку без вмешательства a finally
блок. Например, Вы могли поместить код, чтобы закрыться PrintWriter
в конце try
блок и снова в пределах обработчика исключений для ArrayIndexOutOfBoundsException
, следующим образом.
try { // Don't do this; it duplicates code. out.close(); } catch (FileNotFoundException e) { // Don't do this; it duplicates code. out.close(); System.err.println("Caught FileNotFoundException: " + e.getMessage()); throw new RuntimeException(e); } catch (IOException e) { System.err.println("Caught IOException: " + e.getMessage()); }
Однако, это копирует код, таким образом делая код, трудный читать и подверженный ошибкам, должен Вы изменять его позже. Например, если Вы добавляете код, который может бросить новый тип исключения к try
блок, необходимо не забыть закрываться PrintWriter
в пределах нового обработчика исключений.
finally
блок является ключевым инструментом для того, чтобы предотвратить утечки ресурсов. Закрывая файл или иначе восстанавливая ресурсы, поместите код в a finally
блок, чтобы гарантировать, что ресурс всегда восстанавливается.try-
оператор с ресурсами в этих ситуациях, который автоматически выпускает системные ресурсы когда больше не необходимый. У следующего раздела есть больше информации.