Spec-Zone .ru
спецификации, руководства, описания, API
|
Предыдущие разделы, описанные, как создать try
, catch
, и finally
кодируйте блоки для writeList
метод в ListOfNumbers
class. Теперь, давайте идти через код и исследуем то, что может произойти.
Когда все компоненты соединяются, writeList
метод похож на следующий.
public void writeList() { PrintWriter out = null; try { System.out.println("Entering" + " try statement"); out = new PrintWriter(new FileWriter("OutFile.txt")); for (int i = 0; i < SIZE; i++) out.println("Value at: " + i + " = " + vector.elementAt(i)); } catch (ArrayIndexOutOfBoundsException e) { System.err.println("Caught ArrayIndexOutOfBoundsException: " + e.getMessage()); } catch (IOException e) { System.err.println("Caught IOException: " + e.getMessage()); } finally { if (out != null) { System.out.println("Closing PrintWriter"); out.close(); } else { System.out.println("PrintWriter not open"); } } }
Как упомянуто ранее, этот метод try
у блока есть три различных возможности выхода; вот два из них.
try
оператор приводит к сбою и выдает исключение. Это могло быть IOException
вызванный new FileWriter
оператор или ArrayIndexOutOfBoundsException
вызванный несправедливостью индексируют значение в for
цикл.try
оператор обычно выходит.Давайте смотреть на то, что происходит в writeList
метод во время этих двух возможностей выхода.
Оператор, который создает a FileWriter
может перестать работать по ряду причин. Например, конструктор для FileWriter
броски IOException
если программа не может создать или записать в обозначенный файл.
Когда FileWriter
броски IOException
, система времени выполнения сразу прекращает выполняться try
блок; выполняемые вызовы метода не завершаются. Система времени выполнения тогда начинает искать наверху стека вызова метода соответствующий обработчик исключений. В этом примере, когда IOException
происходит, FileWriter
конструктор наверху стека вызовов. Однако, FileWriter
у конструктора нет соответствующего обработчика исключений, таким образом, система времени выполнения проверяет следующий метод — writeList
метод — в стеке вызова метода. writeList
у метода есть два обработчика исключений: один для IOException
и один для ArrayIndexOutOfBoundsException
.
Системные проверки времени выполнения writeList
's обработчики в порядке, в котором они появляются после try
оператор. Параметр первому обработчику исключений ArrayIndexOutOfBoundsException
. Это не соответствует тип выданного исключения, таким образом, система времени выполнения проверяет следующий обработчик исключений — IOException
. Это соответствует тип исключения, которое было выдано, таким образом, система времени выполнения заканчивает свой поиск соответствующего обработчика исключений. Теперь, когда время выполнения нашло соответствующий обработчик, код в этом catch
блок выполняется.
После того, как обработчик исключений выполняется, система времени выполнения передает управление к finally
блок. Код в finally
блок выполняется независимо от исключения, пойманного выше этого. В этом сценарии, FileWriter
никогда не открывался и не должен быть закрыт. После finally
блокируйте заканчивает выполняться, программа продолжается с первым оператором после finally
блок.
Вот полный вывод от ListOfNumbers
программа, которая появляется когда IOException
бросается.
Entering try statement Caught IOException: OutFile.txt PrintWriter not open
Полужирный код в следующем перечислении показывает операторы, которые выполняются во время этого сценария:
public void writeList() { PrintWriter out = null; try { System.out.println("Entering try statement"); out = new PrintWriter(new FileWriter("OutFile.txt")); for (int i = 0; i < SIZE; i++) out.println("Value at: " + i + " = " + vector.elementAt(i)); } catch (ArrayIndexOutOfBoundsException e) { System.err.println("Caught ArrayIndexOutOfBoundsException: " + e.getMessage()); } catch (IOException e) { System.err.println("Caught IOException: " + e.getMessage()); } finally { if (out != null) { System.out.println("Closing PrintWriter"); out.close(); } else { System.out.println("PrintWriter not open"); } } }
В этом сценарии, всех операторах в рамках try
блок выполняется успешно и не выдает исключений. Выполнение уменьшается конец try
блок, и система времени выполнения передают управление к finally
блок. Поскольку все было успешно, PrintWriter
открыто, когда управление достигает finally
блок, который закрывается PrintWriter
. Снова, после finally
блокируйте заканчивает выполняться, программа продолжается с первым оператором после finally
блок.
Вот вывод от ListOfNumbers
программа, когда никакие исключения не выдаются.
Entering try statement Closing PrintWriter
Полужирный код в следующей выборке показывает операторы, которые выполняются во время этого сценария.
public void writeList() { PrintWriter out = null; try { System.out.println("Entering try statement"); out = new PrintWriter(new FileWriter("OutFile.txt")); for (int i = 0; i < SIZE; i++) out.println("Value at: " + i + " = " + vector.elementAt(i)); } catch (ArrayIndexOutOfBoundsException e) { System.err.println("Caught ArrayIndexOutOfBoundsException: " + e.getMessage()); } catch (IOException e) { System.err.println("Caught IOException: " + e.getMessage()); } finally { if (out != null) { System.out.println("Closing PrintWriter"); out.close(); } else { System.out.println("PrintWriter not open"); } } }