|
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");
}
}
}