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 у блока есть три различных возможности выхода; вот два из них.

  1. Код в try оператор приводит к сбою и выдает исключение. Это могло быть IOException вызванный new FileWriter оператор или ArrayIndexOutOfBoundsException вызванный несправедливостью индексируют значение в for цикл.
  2. Все успешно выполняется и try оператор обычно выходит.

Давайте смотреть на то, что происходит в writeList метод во время этих двух возможностей выхода.

Сценарий 1: Исключение Происходит

Оператор, который создает 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");
        }
    }
}

Сценарий 2: Блочные Выходы попытки Обычно

В этом сценарии, всех операторах в рамках 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");
        }
    }
}

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Оператор попытки с ресурсами
Следующая страница: Определение Исключений, выданных Методом