Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на Java.docx
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
3.45 Mб
Скачать

Тема 4.8 Ключевое слово finally

Иногда требуется гарантировать, что определенный участок кода будет выпол­няться независимо от того, какие исключения были возбуждены и пере­хвачены. Для создания такого участка кода используется ключевое слово finally. Даже в тех случаях, когда в методе нет соответствующего воз­бужденному исключению раздела catch, блок finally будет выполнен до того, как управление перейдет к операторам, следующим за разделом try. У каждого раздела try должен быть по крайней мере или один раз­дел catch или блок finally. Блок finally очень удобен для закрытия файлов и освобождения любых других ресурсов, захваченных для времен­ного использования в начале выполнения метода. Ниже приведен пример класса с двумя     методами, завершение которых происходит по разным причинам, но в обоих перед выходом выполняется код раздела finally.

Листинг 4.9  

public class Main {

public static void metod1() throws ArithmeticException {

try {

System.out.println("Metod1 run");

throw new ArithmeticException("Demo");

} finally {

System.out.println("Metod1 stop");

}

}

public static void metod2() {

try {

System.out.println("Metod2 run");

return;

} finally {

System.out.println("Metod2 stop");

}

}

public static void main(String[] args) {

try {

metod1();

} catch (ArithmeticException e) {

System.out.println("Ошибка при выполнении метода1 " + e);

}

metod2();

}

}

В первом методе исключение сгенерировано вручную, но, не смотря на это, блок finally все равно выполнился. Во втором методе выход из метода осуществлен при помощи return, но блок finally все равно выполнился. В результате выполнения данной программы получили:

Metod1 run

Metod1 stop

Ошибка при выполнении метода1 java.Lang.ArithmeticException: Demo

Metod2 run

Metod2 stop

Тема 4.9 Потомки Exception или написание своих классов ошибок

Только подклассы класса Throwable могут быть возбуждены или пере­хвачены. Простые типы – int, char и т.п., а также классы, не являю­щиеся подклассами Throwable, например, String и Object, использоваться в качестве исключений не могут. Наиболее общий путь для использова­ния исключений – создание своих собственных подклассов класса Ex­ception. Ниже приведена программа, в которой объявлен новый подкласс класса Exception.

Листинг 4.10

public class OverrangeTenException extends Exception {

private int x;

public OverrangeTenException(int x) {

this.x = x;

}

@Override

public String toString() {

return "Значение переменной превысило 10: x=" + x;

}

}

public class Main {

public static void main(String[] args) {

int x = 0;

for (int i = 0; i < 5; i++) {

try {

x = (int) (Math.random() * 20);

if (x > 10) {

throw new OverrangeTenException(x);

}

System.out.println("x=" + x);

} catch (OverrangeTenException ex) {

System.out.println(ex);

}

}

}

}

В данном примере создан собственный класс ошибок, как потомок класса Exception. В случае, если значение переменной превышает значение 10, то выбрасываем исключение. Свое исключение нужно отловить блоком catch (OverrangeTenException ex), иначе программа остановится.

В ходе выполнения данной программы получили:

x=9

Значение переменной превысило 10: x=13

x=5

Значение переменной превысило 10: x=11

x=0

Задание:

Доработайте первое задание к главе 3. Создайте свое исключение SizeMismatchExceprion(несовпадение размеров) и обработайте его.

Выводы к главе:

  • Исключение – это объект одного из классов потомков Throwable

  • Исключение необходимо отловить, до того как оно попадет в список системных ошибок и программа остановится

  • Для обработки исключений в языке Java предусмотрено пять ключевых слов: try, catch, throw, throws и finally.

  • Код, в котором необходимо отслеживать ошибки помещается в блок try.

try{

//код, в котором могут возникнуть ошибки

}

  • Блок try нельзя написать без блока catch и/или finally.

  • Блок catch (если он есть) размещается после блока try

try{

}

catch (Тип_ошибки переменная) {

//обработка ошибки

}

  • Блок finally(если он есть) размещается после блока/блоков catch, если он ест, или сразу после блока try

try{

}

// catch (Тип_ошибки1 переменная) {

// }

// catch (Тип_ошибки2 переменная) {

// }

finally {

//код, который выполняется всегда

}

  • Блок catch или блок finally могут отсутствовать. Но не могут отсутствовать вместе!!!

  • Для генерации исключения используется throw

throw new Конструктор_исключения();

  • 8. Сгенерированные исключения и исключения, возникшие в результате выполнения программы, обрабатываются совершенно одинаково.

  • 9. Если метод не обрабатывает свои исключения, то используют ключевое слово throws, после которого через запятую указывают, какие исключения могут возникнуть в методе.

тип имя_метода(список аргументов) throws список_исключений {

//тело метода

}